UTF8对土耳其地区的反应不同于美国地区 - C#

时间:2018-06-06 00:28:38

标签: c# encoding utf-8 internationalization

我最近编写了一个API(C#.net标准),它连接到其他人编写的TCP服务器。它使用以HTTP协议为中心的自定义数据包。在读/写数据包时,我使用的是UTF8编码。使用API​​的所有客户端无论其区域如何都可以正确连接。但是,来自土耳其(设置为土耳其的区域)的用户无法使用该API。当他们将他们的地区更改为美国时,API可以正常工作。

我的印象是,UTF8应该是一个通用标准,并且会在任何地区做出同样的反应。情况不是这样吗?

试验:

  • Windows 10 .net框架4.6.1 - 美国 - 成功
  • Windows 10 .net框架4.6.1 - TR - 失败
  • Windows 10 .net核心2.0 - 美国 - 成功
  • Windows 10 .net核心2.0 - TR - 失败

编辑:

编码很重要的原因是因为在API中有一种序列化形式。它使用在数据流开头定义的特殊字符将字符串字典序列化为单个字符串。这些特殊字符会根据流的内容而改变。

1 个答案:

答案 0 :(得分:3)

从这些信息中不清楚API调用的性质,但区分大小写的规则因土耳其语和其他语言而异,这是土耳其特定错误的最常见根本原因。

在土耳其语中,虚线小写字母i大写为点缀大写的İ。无点小写ı在大写时成为英语I.

字符串比较操作因此需要根据用例使用不同的规则。您可能希望为命令接口标准化EN-US或C Locale样式的排序规则(在DotNet中,这类似于StringComparer.InvariantCultureIgnoreCase)。对于像文本搜索这样的应用程序,根据用户的需求,显然“正确”的决定将是一个更复杂的决定。

您可能在客户端,服务器端或两者兼而有之。

如果您可以在客户端和服务器端澄清更多关于失败的API调用以及该调用的机制,我可以使用适用于您的案例的更具体信息来更新此答案。

编辑添加: 根据您添加的内容,您可能需要使用new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

之类的内容构建字典对象