'?' Не допустимый символ Unicode, но в наборе символов Unicode? - PullRequest
3 голосов
/ 17 июня 2010

Короткая история: я не могу получить объект типа '?' для хранения в базе данных MySQL, используя текстовое поле в приложении Ruby on Rails (с кодировкой UTF-8 по умолчанию) или вводя его напрямую с помощьюприложение MySQL GUI.

Насколько я могу судить, все китайские иероглифы и радикалы могут быть введены в базу данных без проблем, но только не эти редко встречающиеся "символьные компоненты".Упомянутый выше символ - это Unicode U + 20089 и html-сущность &#131209;. Я могу отобразить его на странице, введя <html>&#131209;</html> и удалив экранирование html, но я хотел бы сохранить его просто как символ Юникода и сохранить HTMLбежать на месте.Есть много других китайских «компонентов» (частей полных символов, обычно состоящих из 2 или 3 штрихов), которые вызывают ту же проблему.

Согласно этой странице, упомянутый символ находится в кодировке UTF-8:http://www.fileformat.info/info/unicode/char/20089/charset_support.htm

Но на соседней странице '... 20089 / index.htm' есть предупреждение о том, что это недопустимый символ Юникода.

Для справки, эту сущность можно найтив Mac OS X путем поиска по палитре символов (международное меню, «Показать палитру символов»), поиска по радикалу и поиска по радикалу «丿».

Извинения, если это слишком открыто.Может ли такой символ храниться в базе данных на основе UTF-8?Как этот символ поддерживается и не поддерживается, присутствует в наборе символов и недопустим?

Ответы [ 4 ]

11 голосов
/ 17 июня 2010

Какую версию MySQL вы используете?Если это версия до 5.5, вы не можете сохранить этот символ, потому что он будет занимать четыре байта, а MySQL поддерживает только до трех байтов UTF-8 (т. Е. Символы в BMP).В MySQL 5.5 добавлена ​​поддержка четырехбайтового UTF-8, но в качестве набора символов необходимо указать utf8mb4.

ref: http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html

1 голос
/ 17 июня 2010

U + 20089 является определенным символом в наборе Unicode ( CJK Unified Ideographs Extension B ) и становится байтовой последовательностью F0 A0 82 89 при кодировании как UTF-8.Вероятно, проблема не в символе, а в обработке символов программным обеспечением где-то в вашем стеке.

В маловероятном случае, если существует техническая причина, по которой этот символ является проблемным, вероятно,для включения в стандарт Unicode или в часто задаваемые вопросы .

0 голосов
/ 17 июня 2010

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

UTF-8 может использоваться для представления любой символ Unicode (кодовая точка).Это верно для всех UTF.Количество байтов, необходимых для этого, варьируется (например, в UTF-8 вам нужно четыре для обозначенной вами кодовой точки, тогда как вам нужен только один для римской буквы «A»), но все символы Unicode могут быть представлены каквсе UTF.Вот для чего они.( Подробнее здесь .)

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

Content-Type: text/html; charset="UTF-8"

... в них.Если они этого не делают, поищите эквивалентный тег meta в самом HTML, хотя я, кажется, вспоминаю, что чтение meta не является хорошим способом сделать это.Если заголовки не являются конкретными, по умолчанию применяется ISO-8859-1 (хотя некоторые браузеры могут использовать Windows-1252 вместо), что не будет работать, если ваш исходный тексткодируется UTF-8.

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

Исходя из вашего вопроса, я не думаю, что you нужно, но я закончу с обязательной заглушкой для статьи Абсолютный минимум каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!) Джоэл Спольски (хотя бы, чтобы спасти кого-то от включения его в комментарии).: -)

0 голосов
/ 17 июня 2010

что если вы дважды закодируете его и сохраните?

получите его еще раз и сохраните.и позже, после извлечения, декодируйте его один раз и визуализируйте в html.

...