string.replaceВсе символы резки 50% времени - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь использовать серию string.replaceAlls, чтобы поменять местами все специальные символы UTF-8 в текстовом файле с кодировкой ASCII и HTML. По пути я столкнулся с особенно упрямым: \ uAC8B, миддот UTF-8.

Вот строка, которая вырезает персонажа в половине случаев:

  string_out = string_out.replaceAll("•", "·");

("¬ï" - это то, как UTF-8 & middot; выглядит как расширенный ASCII. Прежде чем наткнуться на эту строку, я попробовал "\ uAC8B" и многие другие кодировки без успеха.)

Линия отсекает мидот UTF-8, она не заменяет его и делает это только половину времени. В остальное время он пропускает персонажа и оставляет его без изменений. Если я делаю несколько копий или переворачиваю другие строки, это даже не происходит.

Это похоже на проблему многопоточности, но я не знаю ни о какой многопоточности. Просто блок replaceAlls во включенном файле .jsp, запускаемом из другого файла .jsp.

Что может вызвать такое расовое состояние, как поведение?

1 Ответ

4 голосов
/ 04 января 2012

AC8B - это не точка, это китайский символ. Вы имели в виду 00B7?

Строки Java всегда имеют кодировку UTF-16 Unicode. UTF-8 - это способ представления символов Unicode в файле, а не способ хранения строк Java в памяти.

Обратите внимание на кодировку, используемую для чтения входных и выходных файлов, они должны быть UTF-8, но как только содержимое файла будет считано в строку Java, это больше не будет UTF-8, но 16-битный Unicode.

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

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