2010-06-17 2 views
3

Краткая история: я не могу получить сущность типа «'' Недействительный символ Юникода, но в наборе символов Юникода?

+0

Может быть, что U + 20089 является предлагаемым характером, и, следовательно, имеет назначенную точку коды, но на самом деле не является допустимым символ Unicode еще? – Gabe

ответ

11

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

исй: http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html

+0

Я использовал 5.0.67. Теперь я загружаю mysql-5.5.3-m3-osx10.5-x86, и я опубликую результаты после обновления. Я не знаю, как конвертировать уже существующую базу данных в utf8mb4, поэтому я просто создам новое приложение rails с utf8mb4, указанное в качестве кодировки, и посмотрю, могу ли я добавить символ. Я предполагаю, что могу просто изменить файл database.yml для чтения «encoding: utf8mb4» –

+0

Я обновил mysql, переустановил рельсы gem и создал новую базу данных с «encoding: utf8mb4» в файле database.yml. Существует небольшое, но, возможно, значительное изменение: Теперь вместо базы данных, не хранящей ничего, есть знак вопроса, где должен быть символ '. Кроме того, база данных использовала, чтобы потерять все, что я набрал после обидного персонажа. Теперь все, что приходит после, сохраняется без проблем, и поэтому единственная проблема заключается в том, что персонаж появляется как? вместо . Это прогресс ... –

+0

Ах, но Rails на самом деле не сделал таблицу utf8mb4! Не уверен, как я это сделаю автоматически в будущем, но это то, что я сделал на данный момент ... Используя графический интерфейс MySQL, я изменил таблицу и каждый соответствующий столбец на utf8mb4, используя SQL-запросы, представленные в http: //dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html. И вуаля. Да здравствует . Благодаря! –

0

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

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

0

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

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

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

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

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

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

Из Вашего вопроса, я не думаю, что вы это нужно, но я закончу с обязательным штекером для статьи The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) Джоэл Спольски (если только, чтобы спасти кого-то из затыкать его в комментарии) , :-)

+0

Фактически мета-информации не было на странице, но добавление ее не имело значения. Я собираюсь следить за предложением Алана Мура по обновлению MySQl до 5.5 и посмотреть, делает ли это это. –

+0

@Steve: Ну, вам не нужно 'meta', если заголовок есть (и заголовок - лучший способ пойти, если вы можете настроить сервер для его отправки). Конечно, вам нужно убедиться, что вы действительно отправляете действительно UTF-8. Удачи вам. –

1

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

В маловероятном случае, если есть неотъемлемая техническая причина для этого быть проблемой характером, он, вероятно, будет покрыто в Unicode standard или в FAQs.