Возможно, вы получаете Windows-1252, которая является набором символов, а не кодировкой.(Torgamus - поиск в Google для Windows-1232 мне ничего не дал.)
Windows-1252, ранее "Cp1252" - это почти Unicode, но содержит некоторые символы, которые пришли из Cp1252 в ихте же места. En Dash - это символ 150 (0x96), который попадает в диапазон зарезервированных управляющих символов Unicode C1
и не должен быть там.
Вы можете найти символ 150 и заменить его на\u2013
, который является правильной кодовой точкой Unicode для En Dash.
Есть довольно много других символов, которые MS имеет в диапазоне от 0x80 до 0x9f, которые зарезервированы в стандарте Unicode, включая Em Dash, маркерыи их "умные" кавычки.
Редактировать: Кстати, Java использует значения кодовой точки Unicode для символов внутри.UTF-8 - это кодировка , которую Java использует в качестве кодировки по умолчанию при записи строк в файлы или сетевые подключения.
Скажем, у вас есть
String stuff = MSWordUtil.getNextChunkOfText();
Где MSWordUtil
- это то, что вы написали, чтобы получить кусочки файла MS-Word .doc.Он может сводиться к
File myDocFile = new File(pathAndFileFromUser);
InputStream input = new FileInputStream(myDocFile);
// and then start reading chunks of the file
По умолчанию, когда вы считываете байтовые буферы из файла и делаете из них строки, Java будет обрабатывать его как кодированный в кодировке UTF-8.Как говорит лорд Торгамус, есть способы сообщить , какую кодировку следует использовать, но без этого Windows-1252 довольно близка к UTF-8, за исключением тех неприятных символов, которые находятся в элементе управления C1range.
После получения некоторой строки типа stuff
и выше вы не найдете в ней \u2013
или \u2014
, вместо этого вы найдете 0x96 и 0x97.
При этомТочка, которую вы должны быть в состоянии сделать
stuff.replaceAll("\u0096", "\u2013");
Я не делаю этого в моем коде, где мне пришлось иметь дело с этой проблемой.Я перебираю входные данные CharSequence
по одному символу за раз, решаю, основываясь на 0x80 <= charValue <= 0x9f
, нужно ли его заменить, и ищу в массиве, на что его заменить.Вышеуказанная метод replaceAll () намного проще, если все, что вас волнует, это 1252 En Dash против Unicode En Dash.