【问题标题】:UTF8 Reacting differently on Turkey Region than US Region - C#UTF8 在土耳其地区的反应不同于美国地区 - C#
【发布时间】:2018-06-06 00:28:37
【问题描述】:

我最近编写了一个 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 core 2.0 - 美国 - 成功
  • Windows 10 .net core 2.0 - TR - 失败

编辑:

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

【问题讨论】:

  • 什么条件定义成功/失败?
  • 我已经稍微修改了这个问题,并提供了更多信息来回答您的问题。成功意味着它可以正确反序列化字典。
  • 请贴出具体失败的代码,如果没有看到实际执行的代码,我们无法神奇地猜测出什么问题或原因。此外,如果它在 .NET Framework 和 .NET Core 上都失败了,为什么要同时指出它们呢?让您看起来好像看到了不同的行为,而事实并非如此
  • 问题不是针对特定的代码行,因为steam没有正确解码导致多点故障。这个问题更多地围绕着 UTF8 在不同地区的反应不同。代码我可以加,但是有很多。

标签: c# encoding utf-8 internationalization


【解决方案1】:

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

在土耳其语中,带点的小写 i 大写为带点的大写 İ。大写的无点小写 ı 变成英文 I。

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

您的问题可能出现在客户端、服务器端或两者兼而有之。

如果您能更详细地说明失败的 API 调用以及该调用在客户端和服务器端的机制,我或许可以使用适用于您的案例的更具体信息来更新此答案。

编辑添加: 根据您添加的内容,您可能需要使用 new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) 之类的内容构建您的字典对象。

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2013-06-12
    相关资源
    最近更新 更多