And as I have read "\u0096" is cp1252 equivalent for "–".
Я так не думаю.0x0096 в Unicode - это управляющий код C1:
http://en.wikipedia.org/wiki/C0_and_C1_control_codes
и вряд ли будет заменой "-" (как вы написали).
Хорошо, если StringEscapeUtils действительно все испортило (en dash действительно должно быть \ u2013), и если это единственный выход, он испортился, и если нет никаких причин иметь какой-либо другой 0x0096 в вашей строке, то replaceAll после с вызовом StringEscapeUtils должно работать.
Следующее заменитель, которого вы ожидаете:
System.out.println("Broken\u0096stuff".replaceAll("\u0096", "\u2013"));
Однако вы должны сначала сделатьубедитесь, что StringEscapeUtils действительно испортили вещи и действительно, действительно, понимают, почему / как вы получаете этот 0x0096 в строке Java.
Тогда также, вероятно, вам следует указать, чток сожалению, поддержка Unicode в Java является основным SNAFU, потому что Java была задумана еще до выхода Unicode 3.1.
Следовательно, казалось разумным использовать 16 бит для примитива char , это казалось разумной идеейиспользовать 4-hexdigits '\ uxxxx' escape-последовательность, казалось разумным представить длину char [] в методе length () String и т. д.
На самом деле все они были оченьглупая идея, ведущая к одному из главных Java SNAFU, где примитив char не может фактически содержать символ Unicode больше и где метод длины String действительно not возвращает реальную длину String.
Мне нравится следующее:
final char brokenCharCannotRepresentUnicode31Codepoints = '\uFFFF'; // How do I store a Unicode 3.1 codepoint here!?
Почему эта напыщенная речь?Ну, потому что я не знаю, как реализована замена регулярного выражения в replaceAll в String, но я действительно не был бы удивлен, если бы были случаи ( то есть определеннокодовые точки) где String replaceAll был, например, char и как length и как \ uxxxx , ну .. хммм, полностью сломан.