Как получить точно строку UTF-8 в java? - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу получить строку UTF-8 из кода ниже:

String tmpStr= "ALMS_à¸à¸±à¹à¸à¸à¸­à¸à¸¥à¸à¸à¸°à¹à¸à¸µà¸¢à¸.pdf";
String fileName = new String(tmpStr.getBytes(), Charset.forName("UTF_8"));

Но когда я отлаживаю, неверное значение fileName, как показано ниже: ALMS_�? ั �? �? �? อ �? ล �? �? ะ �? �? ี ย �? .Pdf enter image description here

Пока я тестировал конвертирование онлайн, он работал нормально: enter image description here

Кто-нибудь может помочь мне решить проблему? Спасибо. Я использую eclipse для кодирования java и настраиваю кодировку UTF-8 в нем.

1 Ответ

0 голосов
/ 16 апреля 2020

Не знаю, откуда вы берете исходную строку, но Java внутренне использует UTF-16 для представления строк.

Использование кодировок имеет смысл, когда вам нужно serialize строка для передачи по соединению, сохранения в базе данных, печати в текстовом файле или на веб-странице.

То, что передается / сохраняется / печатается, представляет собой массив байтов String в выбранной кодировке. .

То же самое при получении / чтении значения через соединение, файл или базу данных. Вам необходимо интерпретировать байты в правильной кодировке.

String предоставляет метод getBytes(), который получает представление String, используя кодировку платформы по умолчанию, это не рекомендуется, поскольку делает кодовую платформу зависимой. Вы можете предоставить кодировку либо String, либо getBytes("UTF-8"), либо charset. Начиная с Java 1.7, класс StandardCharsets предоставляет ярлыки для кодировок, которые должны поддерживать JVM, поэтому вы можете использовать getBytes(StandardCharsets.UTF_8).

Теперь ваш код должен выглядеть примерно так:

String tmpStr= "ALMS_à¸à¸±à¹à¸à¸à¸­à¸à¸¥à¸à¸à¸°à¹à¸à¸µà¸¢à¸.pdf";  
String fileName = new String(tmpStr.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);

Но это не даст ожидаемую строку, а только получит представление tmpStr в байтах UTF-8 и создаст новое представление строки, считывающее представление байтов UTF-8. Таким образом, после этого вы можете утверждать, что tmpStr равно filename.

Я подозреваю, что проблема, с которой вы сталкиваетесь, связана с тем, откуда вы читаете значение tmpStr и какая кодировка используется для его преобразования в Строка в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...