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

İlh*_*LİK 14 encoding utf-8

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

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

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

Jon*_*oni 17

您提到的字符以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
Run Code Online (Sandbox Code Playgroud)

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

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

Locale tr = new Locale("TR","tr");     //    Turkish locale
print("Çç????Öö??Üü".toUpperCase(tr)); //    ÇÇ???IÖÖ??ÜÜ
print("Çç????Öö??Üü".toLowerCase(tr)); //    çç??i?öö??üü
Run Code Online (Sandbox Code Playgroud)

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

Unicode定义每个字符的代码点和某些属性(例如,如果它是数字或字母,如果是大写,小写或标题,则为字母),以及用于处理Unicode文本的某些通用算法(例如,如何混合从右到左的文本和从左到右的文本).国家标准化机构定义了字母顺序和正确的案例转换,如芬兰的芬兰语言学院,西班牙的RealAcademiaEspañola,独立于Unicode.

更新2:

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

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