UTF-8 для преобразования ASCII в Java - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть одна строка, которая содержит формат набора символов UTF-8.

String str = "100µF";

И мой вывод желаемой строки: "100µF"

Я проверил StackOverflow и получилкод ниже

public static String decompose(String s) {
    return java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","");
}

Но я получил вывод строки выше "100AµF"

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Это XY проблема .

Проблема здесь в том, что ваша строка была создана из байтов, используя неверный набор символов , который предполагает, что один байт - один символНапример, ISO 8559-1 .

Но байты не являются ASCII и не являются ISO 8859-1.Байты представляют собой текст UTF-8.

Не заменяйте никакие символы.Не нормализуйте строку.Единственное правильное решение состоит в том, чтобы вернуть неправильно декодированную строку обратно в байты, а затем правильно декодировать байты, используя UTF-8:

byte[] originalBytes = str.getBytes(StandardCharsetes.ISO_8859_1);

str = new String(originalBytes, StandardCharsets.UTF_8);
0 голосов
/ 27 ноября 2018

Вы имеете дело с µ (U + 00B5, МИКРОЗНАК) и Â (U + 00C2, ПИСЬМО ЛАТИНСКОГО КАПИТАЛА С КРУГОМ ФЛЕКСОМ).Оба эти символа принадлежат к Латинскому 1-му дополнению блока юникода .

Если вы хотите разрешить µ, но запретить Â, вы должны выполнить фильтрацию самостоятельно.Не будет отдельной группы символов (\p{}) для каждого из символов.

Один из способов сделать это - определить фильтр белого списка:

String input = "100µF";
String allowedFilter = "[^\\p{ASCII}µ]"; // regular ASCII + µ sign
String output = input.replaceAll(allowedFilter, "");
System.out.println(output); // 100µF

Выполнитьобратите внимание, что и µ, и Â могут быть представлены в Extended ASCII , поэтому фильтрация одного, а не другого противоречит интуиции.

0 голосов
/ 27 ноября 2018

В ASCII нет µ символа, поэтому вы не можете записать его в ASCII.

Java Строка s - это последовательность символов Юникода (и внутренне кодируются в UTF).-16), поэтому проблема, с которой вы сталкиваетесь, зависит либо от того, как вы читаете эту строку, либо от того, как вы ее пишете.

Обычно эта проблема решается созданием OutputStreamWriter(OutputStream out, String charsetName) или InputStreamReader(InputStream in, String charsetName) установки правильного набора символов,

Так что, если, например, вы получаете свою строку из файла в кодировке UTF-8, вы должны создать читатель, подобный этому:

Reader in = new InputStreamReader(new FileInputStream('some_file.txt'),"UTF-8")

Или, если вы пишете в ISO-Latin-1 файл, который вы должны создать Writer следующим образом:

Writer out = new OutputStreamWriter(new FileOutputStream('some_file.txt'),"ISO-8859-1")

Подобные вещи могут происходить с HTTP-запросом / ответом, в зависимости от того, как тело каждого интерпретируется сервером приложений или браузером, если это ваш случайЗатем вы добавляете некоторые детали к вашему вопросу.

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