不是有效的Unicode字符,但它在Unicode字符集中吗?

3
简述:我无法将像“𠂉”这样的实体存储到MySQL数据库中,无论是在Ruby on Rails应用程序中使用文本字段(具有默认的UTF-8编码),还是通过直接使用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的数据库中?这个字符既受支持又不受支持,既存在于字符集中又无效?


U+20089是一个提议的字符,因此已经分配了代码点,但它目前还不是一个有效的Unicode字符,这可能是真的吗? - Gabe
4个回答

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


我之前使用的是5.0.67版本。现在我正在下载mysql-5.5.3-m3-osx10.5-x86,并在更新后发布结果。我不知道如何将已有的数据库转换为utf8mb4,因此我将创建一个新的rails应用程序,并将utf8mb4指定为编码方式,以查看是否可以添加该字符。我认为只需更改database.yml文件中的“encoding: utf8mb4”即可。 - Steve Cotner
我更新了mysql,重新安装了rails gem,并在database.yml文件中创建了一个带有“encoding:utf8mb4”的新数据库。 有一个小但可能重要的变化: 现在,数据库不再存储任何东西,而是在应该为 '' 字符的地方出现了一个问号。 此外,数据库过去会在有问题的字符后面失去我键入的所有内容。现在,所有随后输入的内容都可以保存,所以唯一的问题是该字符显示为?而不是。 这是进步... - Steve Cotner
啊,但是Rails实际上并没有将表格设置为utf8mb4!不确定未来如何自动完成此操作,但目前我所做的是...使用MySQL GUI,我修改了表格和每个相关列以使其成为utf8mb4,使用了http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html提供的SQL查询。然后就完成了。长命百花谷。谢谢! - Steve Cotner

1

U+20089是Unicode集合中的一个定义字符(CJK统一表意符号扩展B),当编码为UTF-8时,它变成了字节序列F0 A0 82 89。问题可能不在于字符本身,而是在您的软件堆栈中某个地方处理字符的方式。

如果这是一个问题字符的固有技术原因,那么很可能会在Unicode标准常见问题解答中有所涉及。


0

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

UTF-8可以用于表示任何Unicode字符(代码点)。所有UTF都是如此。所需的字节数因情况而异(例如,在UTF-8中,您需要四个字节来表示您确定的代码点,而对于罗马字母“A”,您只需要一个字节),但是所有Unicode字符都可以由所有UTF表示。这就是它们的作用。(更多信息。)

听起来好像您在应用程序的一个或多个层面遇到了编码问题。首先要查看的地方是您的应用程序提供的页面:它是否说明了使用的字符集?值得检查返回给您的页面的标头,以查看它们是否具有:

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!)》结尾(即使只是为了节省其他人评论中插入它的时间)。:-)


事实上,元信息不在页面上,但添加它并没有任何影响。我将跟进Alan Moore的建议,将MySQL更新到5.5版本,看看是否解决了问题。 - Steve Cotner
@Steve:如果已经有头文件了,就不需要 meta 了(如果你可以配置服务器发送它,那么头文件是更好的选择)。当然,你还需要确保你实际发送的确实是 UTF-8。祝你好运。 - T.J. Crowder

0

如果您对其进行双重编码并存储会怎样呢?

再次对其进行编码并存储。在检索时解码一次并以HTML格式呈现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接