Cloudant java нелатинские символы
У меня возникли трудности при попытке использовать клиент Cloudant java с греческими символами. Сохранение объектов, содержащих строки с греческими символами, кажется, работает нормально, так как они правильно отображаются на консоли Cloudant. Ниже приведен минимальный тестовый случай для этого. DummyObject имеет строковое имя, _id и _rev.
String password = "xxxx";
CloudantClient client = new CloudantClient("xx", "xxx", password);
Database database = client.database("mydatabase", false);
DummyClass dummyobject = new DummyClass();
dummyobject.setName("ά έ ό ύ αβγδεζηθικλμνξ");
Response saveResponse = database.save(dummyobject);
String id = saveResponse.getId();
String result=new String();
DummyClass loaded = database.find(DummyClass.class,id);
result = result+"Object:"+loaded.getName()+"n"; //Prints out garbage
result = result+"UTF-8:"+new String(loaded.getName().getBytes(),Charset.forName("utf-8"))+"n"; //Prints most characters correct, except for some accented ones
InputStream inputStream = database.find(id);
DummyClass loadedFromStream = Json.fromJson(Json.parse(inputStream), DummyClass.class);
result = result+"From Stream:"+loadedFromStream.getName(); //prints out fine
return ok(result);
Извлекая поток и используя Джексона для десериализации, вывод верен, но тогда мне пришлось бы реализовать многие из предоставленных методов для представлений, bulk манипуляции с документами и т.д.
Возможно, проблема заключается в библиотеке LightCouch, а именно здесь: CouchDbClientBase.java , так как это точка, которую я нашел, отличается между двумя реализациями (get() как объект и как поток). Однако я не знаю, как это подтвердить, исправить или обойти.
2 ответа:
Мы исправили это в выпуске 1.1.0, я думаю:
Https://github.com/cloudant/java-cloudant/releases/tag/1.1.0
[FIX] Fixed handling of non-ASCII characters when the platform's default charset is not UTF-8.
Проблема действительно была в библиотекеLightCouch . Сделав следующее изменение и соответствующие изменения в коде для представлений, исправил его.
return getGson().fromJson(new InputStreamReader(in), classType);
К
return getGson().fromJson(new InputStreamReader(in, Charset.forName("UTF-8")), classType);