2013-04-24 179 views
1

当我从一些网站上下载数据,有时数据的编码是UTF8,但像这样:错误与utf8编码

Thỏ , Nạt 

的重音符号是字符分隔的时候,其实这些字符串必须是:

Thỏ, Nạt 

我不知道这里有什么问题以及如何纠正它。有人可以帮我这个

+1

系统上的代码没有解释网站发送的字符。 Unicode有一些组成字符。例如,ô是Unicode中的单个字符。然而,还有更多的字符比预分解形式可以做到的更多。所以,有口音字符组合。 o和^(U + 0302,COMBINING CIRCUMFLEX ACCENT)的组合等于ô。该网站将越南文字符作为基本字符并结合口音。你的系统必须被教导把它们放回到一起。 – 2013-04-24 03:10:33

+0

感谢您的帮助。我在红宝石的unicode宝石的帮助下把它重新带回了成功的角色。 – Harue 2013-04-24 03:30:48

回答

3

第一个示例字符串包含两个分解形式的越南语字符。他们中的第一个是“ỏ”,由简单的字母“o”组成,后面是U + 0309 COMBINING HOOK above。

第二个示例字符串包含那些预分解形式的字符。其中第一个是“ỏ”U + 1ECF拉丁字母小写字母O。

分解和预分解形式被定义为“规范等价”,通常会导致相同的呈现(尽管这并不总是会发生)。然而,它们并不相同。在字符和字符串的编程比较中,它们是非常不同的。

大多数带有符号的拉丁字母,例如“é”和“ä”,仅用于预分解形式,因为这是键盘驱动程序,在线键盘,字符选取实用程序等通常会生成的。然而,越南的键盘驱动器通常是这样工作的,即在输入一个基本字符后输入一些变音符号,这样变音符号就产生为一个组合字符,即字母(如“ỏ”)就是分解形式。

在许多情况下推荐的处理此问题的一种方法是将字符串转换为标准化表单C(NFC)。这会将这些字符转换为预先组合的形式。但是,请注意,转换为NFC也会删除其他一些区别(但如果文本仅限于越南语且不包含特殊符号,则这不相关)。

为什么第一个样本字符串在逗号前有一个空格字符仍然是个谜。

+0

谢谢你的亲切帮助。我已经按照你的建议解决了这个问题。 – Harue 2013-04-24 07:37:46