Кодировка символов: â? - PullRequest
       4

Кодировка символов: â?

2 голосов
/ 28 декабря 2010

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

Пользователи могут вводить текст (или вырезать и вставлять) в текстовый редактор Ext-Js. Данные отправляются в severlet, который сохраняет их в базе данных, и когда я просматриваю их в базе данных, я вижу эти странные символы ...

  1. есть ли способ декодировать их обратно в их первоначальное значение, если мне удалось обнаружить правильное кодирование - или произошла потеря битов или байтов в процессе преобразования?

  2. Пользователи вырезали и вставляли из нескольких версий MS Word и PDF. Соответствует ли кодировка тому, откуда пользователь скопировал?

Спасибо


веб-сайт UTF-8 Мы используем MS SQL Server 2005;

SELECT serverproperty ('Collation') - сортировка по умолчанию для сервера. Latin1_General_CI_AS

SELECT databasepropertyex ('xxxx', 'Collation') - база данных по умолчанию SQL_Latin1_General_CP1_CI_AS

и столбец:

Column_name Type    Computed    Length  Prec    Scale   Nullable    TrimTrailingBlanks  FixedLenNullInSource    Collation
text    varchar no  -1                  yes no  yes SQL_Latin1_General_CP1_CI_AS

Не-Unicode эквиваленты Типы данных nchar, nvarchar и ntext в SQL Server 2000 перечислены ниже. Когда данные Unicode вставляются в один из этих столбцов типа данных не-Unicode через командную строку (в противном случае известный как «языковое событие»), SQL Сервер преобразует данные в данные введите с использованием связанной кодовой страницы с сопоставлением столбца. когда персонаж не может быть представлен на кодовая страница, она заменяется вопросительный знак (?) с указанием данных был потерян Появление неожиданные персонажи или вопрос отметки в ваших данных указывают на ваши данные был преобразован из Unicode в не Unicode на каком-то слое, и это преобразование привело к потере символы.

Так что это может быть основной причиной проблемы ... и не просто решить с нашей стороны.

Ответы [ 4 ]

3 голосов
/ 29 декабря 2010

â кодируется как 0xE2 в ISO-8859-1 и windows-1252.0xE2 также является ведущим байтом для трехбайтовой последовательности в UTF-8.(В частности, для диапазона от U + 2000 до U + 2FFF, который включает символы windows-1252 –—‘’‚“”„†‡•…‰‹›€™).

Таким образом, похоже, что у вас есть текст, закодированный в UTF-8, который неправильно интерпретируется какwindows-1252 и отображается как â, за которым следуют два непечатаемых символа.

2 голосов
/ 28 декабря 2010

Это некая образованная догадка, что вы просто испытываете наивное преобразование документов Word / PDF в HTML.(наиболее вероятно, с windows-1252 до utf8). В этом случае, вероятно, 2/3 загадочных символов в документах Word являются «умными цитатами», а большинство остальных - результат их других «умных» функций редактирования, elipsis, em dashes.и т. д. PDF-файлы, вероятно, имеют схожие характеристики.

Я бы также предположил, что если форматирование после вставки в редактор ExtJS выглядит нормально, то кодирование передается.В зависимости от полученного в результате использования текста вам может не потребоваться преобразование.

Если я все еще нахожусь на базе, и мы не говорим о проблемах интернационализации, то я могу добавить, что есть Word в HTMLесть конвертеры, но я не знаю деталей их работы, и у меня был неоднозначный успех при их оценке.Почти наверняка есть небольшая потеря / ошибка информации, связанная с такими конвертерами, так как они должны догадаться об источнике «умных» символов.В моем изолированном случае было проще просто вернуться к пользователям и отключить их «умные» функции.

0 голосов
/ 28 декабря 2010

Проблема ясна: если браузер достаточно хорош, форма на веб-странице может принимать любой символ Юникода, который вы можете ввести или вставить. Если символ принадлежит кодировке HTML, он будет отправлен как есть. Если этого не произойдет, он будет преобразован в HTML-сущность. SQL Server выполнит соответствующее преобразование и автоматически испортит ваши данные, когда у символа нет эквивалента.

Вы ничего не можете сделать, чтобы полностью исправить это, но вы можете сделать обходной путь: пусть ваш сервлет выполнит преобразование. Таким образом, у вас есть полный контроль над этим. Например, вы можете составить список самых распространенных вставляемых пользователями нелатинских символов (умные кавычки, пробелы в юникоде ...), которые должно быть довольно легко определить из контекста, и заменить их чем-то еще лучше, чем ?. Или вы используете библиотеку, которая делает это для вас.

Или вы можете переключить свою БД в Unicode:)

0 голосов
/ 28 декабря 2010

Вы храните данные Unicode, которые используют 2 байта на символ, в столбцах типа varchar, которые используют 1 байт на символ.любой текст, который использует 2 байта на символы, будет потерян 1 байт при сохранении в БД.

Все, что вам нужно сделать, это изменить столбец varchar на nvarchar.
, а затем изменить параметры sql, используемые вкод конечно.

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