Почему я не могу использовать Ñ в своем выводе XML, когда объявлен как UTF-8? - PullRequest
4 голосов
/ 23 февраля 2011

В моей базе данных Z / OS DB2 есть символ 'N Tilde'. Я генерирую XML-файл из данных. В XML у меня есть encoding=UTF-8, однако Internet Explorer выдает ошибку Illegal character in text field. Если я изменю кодировку на ISO-8859-1, она будет работать нормально.

Я думал, что ISO-8859-1 является подмножеством UTF-8, так почему он не работает с UTF-8?

Является ли UTF-8 лучшим для XML-документа?

Ответы [ 4 ]

9 голосов
/ 23 февраля 2011

ISO-8859-1 является , а не подмножеством UTF-8. Он может представлять подмножество символов, представляемых в UTF-8, но это не так.

И ISO-8859-1, и UTF-8 являются надмножествами ASCII (т.е. они могут представлять все символы, которые может представлять ASCII, и они представляют их одинаково).

Таким образом, вы не можете просто пометить данные ISO-8859-1 как UTF-8 и надеяться, что они работают, вам нужно фактически сохранить (или преобразовать) ваши данные как UTF-8.

2 голосов
/ 23 февраля 2011

UTF-8 ≠ Unicode

Обратите внимание:

  • ASCII является подмножеством ISO 8859-1.
  • ASCII является подмножеством Unicode.
  • ASCII является подмножеством UTF-8.
  • ISO 8859-1 является подмножеством Unicode.
  • ISO 8859-1 являетсяне подмножество UTF-8.
  • Unicode - это не то же самое, что UTF-8.

Я настоятельно рекомендую ознакомиться стонкости в современной терминологии .

Если это слишком запутанно, вы можете взглянуть на Radix-50 , у которого репертуар на много порядков меньше, чем у Юникода, но который, тем не менее, демонстрирует некоторые из тех же тонкостей, которые теперь избегают людейв отношении Unicode, наборов символов, наборов кодированных символов, форм кодирования символов и схем кодирования символов.

Java chars Невозможно удерживать символы

Поскольку вы пришли к этому из Javaна самом деле вы не виноваты в том, что в вашем разуме это явно не отдельные понятия.Это связано с тем, что Java серьезно запутывает эти проблемы, не отделяя точки абсолютного кода (логические символы) набора кодированных символов от простейшей механики одной конкретной формы кодирования символов .

Жалкая связь Java chars с логическими символами чрезвычайно подвержена ошибкам;возможно, было бы точнее сказать, что смешение программистов на Java одно и то же.В любом случае, теперь, похоже, нет надежды на исправление, когда-либо .

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

Обучение всему этому - единственно возможная паллиативная помощь, но это не настоящее лекарство.

1 голос
/ 23 февраля 2011

ISO-8859-1 вовсе не является подмножеством UTF-8. ASCII является подмножеством ISO-8859-1 и UTF-8. Они специально различаются для символов в диапазоне кодовых точек Unicode U + 0080 - U + 00FF.

В ISO-8859-1 символ 'С' (U + 00D1 LATIN CAPITAL LETTER N WITH TILDE) представлен как один байт D1. В UTF-8 один и тот же символ представлен двухбайтовой последовательностью C3 91.

0 голосов
/ 23 февраля 2011

Для генерации XML в Java лучше всего использовать библиотеку XML - это также гарантирует, что все правильно сформировано.

Если вы должны создать его вручную,Лучше всего использовать new OutputStreamWriter(stream, encoding), где кодировка совпадает с кодировкой, которую вы пишете в преамбуле XML.

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

...