如何为土耳其语特殊字符(非ascii)定义/声明utf-8代码点以将它们用作标准的utf-8编码?

时间:2013-02-04 03:45:56

标签: encoding utf-8

Türkishchars'ÇçĞğİıÖöŞşÜü'在utf-8编码中处理不正确,尽管它们似乎都被定义了。所有这些字符的密码都是65533(替换字符,可能用于错误显示),并根据所选字体显示问号或框。在某些情况下,0 / null作为charcode返回。在互联网上,有很多工具给出了utf-8的定义,但我不确定工具是否使用任何已定义的(真实/国际)注册表或动态创建具有已知规则和计算的定义。它们的字体定义明确,当我们手动输入代码点时显示它们没有问题。这证明它们是在utf-8中定义的。但另一方面,它们不会在编码或变换中处理,例如ajax请求/响应。

所以基本问题是“我们如何定义一个字符的代码”? 该问题可以如下定制以防止误解。假设我们已经为这样的“Ç”准备了编码数据 - > 性格:Ç 角色名称:拉丁文大写字母C与CEDILLA 十六进制代码点:00C7 十进制代码点:199 十六进制UTF-8字节:C387 ...... 我们如何/如何将此信息保存为标准的utf-8字符? 我们如何分发/揭露它(准备好被他人使用)? 我们是否需要任何人/基金会的确认(如unicode / utf-8联盟) 如果错误已经注册但无法正常工作,我们如何检测/修复错误? 我们可以使用custom-utf8配置吗?如果是的话怎么样?

注意:此处不需要代码段,因为它不是误用问题。

1 个答案:

答案 0 :(得分:15)

您提到的字符存在于Unicode中。以下是十六进制的字符代码以及它们如何以UTF-8编码:

      Ç     ç     Ğ     ğ     İ     ı     Ö     ö     Ş     ş     Ü     ü
Code: 00c7  00e7  011e  011f  0130  0131  00d6  00f6  015e  015f  00dc  00fc
UTF8: c3 87 c3 a7 c4 9e c4 9f c4 b0 c4 b1 c3 96 c3 b6 c5 9e c5 9f c3 9c c3 bc

这意味着如果您将文件0xc4 0x9e写入文件中,则表示您已编写Ğ字符,并且任何理解UTF-8 的软件工具必须读取它返回Ğ

更新:要使用土耳其语进行正确的字母顺序和大小写转换,您必须使用了解区域设置的库,就像使用其他任何自然语言一样。例如在Java中:

Locale tr = new Locale("TR","tr");     //    Turkish locale
print("ÇçĞğİıÖöŞşÜü".toUpperCase(tr)); //    ÇÇĞĞİIÖÖŞŞÜÜ
print("ÇçĞğİıÖöŞşÜü".toLowerCase(tr)); //    ççğğiıööşşüü

注意我是如何用大写字母变成İ,而我用小写字母变成ı。你没有说你使用的编程语言,但它的标准库肯定也支持语言环境。

Unicode定义每个字符的代码点和某些属性(例如,如果它是数字或字母,对于字母,如果它是大写,小写或标题),以及用于处理Unicode文本的某些通用算法(例如,如何混合从右到左的文本和从左到右的文本)。字母顺序和正确的案例转换由国家标准化机构定义,如芬兰的Institute of Languages of Finland,西班牙的Real Academia Española,独立于Unicode。

更新2:

世界上大多数语言的小写测试((ch&0x20)==ch)都被打破了,而不仅仅是土耳其语。你提到的将大写转换为小写的算法也是如此。此外,作为一封信的测试是不正确的:在许多语言中,Z不是字母表中的最后一个字母。要正确使用文本,您必须使用由知道他们正在做什么的人编写的库函数。

Unicode应该是通用的。创建国家和语言特定的编码变体是导致我们解决Unicode试图解决的混乱的原因。不幸的是,订购字符没有通用标准。例如,在英语中a =ä< z,但在瑞典语中< z<一个。在德语中,Ü相当于一个标准的U,另一个相当于UE。在芬兰语中Ü= Y.无法订购代码点,因此每种语言的排序都是正确的。

相关问题