2012-08-16 3 views
0

Я получаю ByteBuffers в приложении UDP Java.Получить многоязычные данные от ByteBuffer

Теперь данные в этом ByteBuffer могут быть любой строкой на любом языке или в любых специальных символах, разделенных нолем.

Я использую следующий код, чтобы получить из него строки.

public String getString() { 
byte[] remainingBytes = new byte[this.byteBuffer.remaining()]; 
this.byteBuffer.slice().get(remainingBytes); 
String dataString = new String(remainingBytes); 
int stringEnd = dataString.indexOf(0); 

if(stringEnd == -1) { 
    return null; 
} else { 
    dataString = dataString.substring(0, stringEnd); 
    this.byteBuffer.position(this.byteBuffer.position() + dataString.getBytes().length + 1); 

    return dataString; 
} 
} 

Эти строки хранятся в БД MySQL со всем установленным в UTF8.

ЕСЛИ я запускаю приложение в Windows, тогда отображаются специальные символы, такие как ®, но китайцы не являются.

При добавлении аргумента VM -Dfile.encoding = UTF8 отображаются китайцы, но символы, подобные ®, показаны как? и т.д.

Пожалуйста, помогите.

Редактировать:

входных строк в пакете UDP являются с переменной длиной поля байт, закодированные в UTF-8, останавливали 0x00

Для JDBC также я использовать useUnicode = истина & characterEncoding = UTF -8

ответ

1

String dataString = new String(remainingBytes); неправ. Вы почти никогда не должны этого делать. Вы должны выяснить, какая кодировка используется, чтобы поместить байт в пакет UDP, и использовать ту же кодировку на этой линии:

String dataString = new String(remainingBytes, encoding); // e.g. "UTF-8" 

Edit: на основе обновленной вопрос, encoding должен быть "UTF-8"

+0

Нужно ли даже при использовании -Dfile.encoding = UTF8 в качестве аргумента VM? – User1234

+0

Да. Не используйте этот аргумент виртуальной машины, это не относится к – artbristol

+0

при использовании ** новой строки (оставшиеся байты, «UTF-8»); ** и ** dataString.getBytes («UTF-8») ** китайский символ отображается правильно , Но ® не отображается! – User1234

0

Не уверен, но dataString содержит только данные до этого нуля, потому что stringEnd показывает при первом нулевом размещении, но не позади.

dataString = dataString.substring (0, stringEnd + 1);

или

символ specChar = dataString.substring (stringEnd, stringEnd + 1); и он должен возвращать только особый характер, но, как я сказал в biggining, не уверен ...

+0

это работает отлично подходит для английских данных. Я вызываю getString() несколько раз, чтобы получить дополнительные данные. – User1234

Смежные вопросы