''不是有效的unicode字符,但在unicode字符集中?

时间:2010-06-17 09:23:38

标签: mysql ruby-on-rails unicode cjk utf8mb4

简短的故事:我无法通过使用Ruby on Rails应用程序中的文本字段(使用默认的UTF-8编码)或直接输入来将“?”这样的实体存储在MySQL数据库中一个MySQL GUI应用程序。

据我所知,所有中文字符和字根都可以毫无问题地输入到数据库中,但不能输入这些很少输入的“字符组件”。上面提到的字符是unicode U + 20089和html实体&#131209; 我可以通过输入<html>&#131209;</html>并删除html转义来在页面上显示它,但我想将其存储为unicode字符并保持html转义到位。还有许多其他中文'组件'(全部字符的一部分,通常由2或3个笔画组成)导致同样的问题。

根据此页面,提到的字符位于UTF-8字符集中:http://www.fileformat.info/info/unicode/char/20089/charset_support.htm

但是在邻近的'... 20089 / index.htm'页面上,有一条警告说它不是一个有效的unicode角色。

作为参考,可以在Mac OS X中找到该实体,方法是搜索字符调色板(国际菜单,“显示角色调色板”),按照激进搜索,并查看“丿”激进。

道歉,如果这太开放了......这样的角色可以存储在基于UTF-8的数据库中吗?如何支持和不支持此字符,这两个字符都存在于字符集中且无效?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

U + 20089是Unicode集(CJK Unified Ideographs Extension B)中的已定义字符,在编码为UTF-8时成为字节序列F0 A0 82 89。问题可能不在于字符,而在于堆栈中某处的软件处理字符。

如果这是一个问题特征存在固有的技术原因,则可能会在Unicode standardFAQs中涵盖。

答案 2 :(得分:0)

如果你对它进行双重编码并存储怎么办?

再次对其进行编码并存储。然后在检索时解码一次并在html中渲染。

答案 3 :(得分:0)

我无法回答它被列为支持和不支持的问题,这可能是运行fileformat.info网站的人的问题。

UTF-8可用于表示任何 Unicode字符(代码点)。所有的UTF都是如此。这样做所需的字节数会有所不同(例如,在UTF-8中,您需要四个用于您标识的代码点,而您只需要一个用于罗马字母'A'),但所有Unicode字符都可以表示为所有的UTF。这就是他们的目的。 (More here。)

听起来好像您在应用中的一个(或多个)图层遇到了编码问题。首先要看的是您的应用所提供的页面:它是否说明了它使用的字符集?可能值得检查为您的网页返回的标头,看看它们是否有:

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

......在他们中间。如果他们不这样做,请在HTML本身中查找等效的meta标记,但我似乎记得读到meta不是一个好方法。如果没有标题是特定的,则默认应用可能是ISO-8859-1(尽管某些浏览器可能会使用Windows-1252代替),如果源文本使用UTF-8编码,则无效。

下一个要查看的地方是您的数据库。我不认为默认情况下MySQL会以UTF-8存储文本,你需要确保它在你的MySQL配置中这样做。

从你的问题来看,我不认为需要它,但我将完成Joel Spolsky撰写的文章 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 的强制性插件(如果只是为了节省某人在评论中插入它)。 : - )