【问题标题】:Why does "i" get replaced with "ı"为什么“i”会被“ı”取代
【发布时间】:2013-04-04 21:40:05
【问题描述】:

我收到了来自一个应用程序的崩溃报告,该应用程序试图从之前写入的文件中读取 XML。在请求用户将文件发送给我后,我将它与应该编写的内容进行了比较,发现了一个我以前从未遇到过的非常奇怪的问题。

部分(但不是全部)i 字符已替换为 ı - 一个无点的 i。例如,一个名为“title”的节点很好,但一个名为“initialdirectory”的节点将第一个 i 替换,第二个被保留,即ınitialdirectory

直到今天我什至不知道有这样一个字符,但现在我知道了,我只是不知道它是如何编写的 - XML 是使用带有 UTF8 编码的XmlWriter 编写的。只是一个普通的日常写作,没有什么复杂的。

我通常(嗯,自从获得 Resharper 并且它因为跳过参数而对我大喊大叫)在执行 IndexOf 等时使用 StringComparison.OrdinalIgnoreCase,但我不知道在编写时应该如何执行此操作数据,除非我应该开始改变线程文化。

以前有没有人遇到过类似的问题,如果有,最好的处理方法是什么?

【问题讨论】:

标签: c# xml localization culture


【解决方案1】:

在土耳其语中有两个 i:一个带点,i,一个不带点,ı。在大写中,第一个有一个点,İ,而第二个没有,I

在某些时候,您的程序会根据默认区域设置将InitialDirectory 转换为小写,在世界某些地方该区域为土耳其语。要解决此问题,您可以使用固定的已知语言环境(例如美式英语)转换大小写。

更新:更好的是,使用ToLowerInvariant() 方法将"invariant culture" 中的字符串转换为小写。

【讨论】:

  • 我认为最好使用不变文化而不是en-US。为了使这更容易,甚至还有一个快捷方式:ToLowerInvariant()
  • 谢谢@svick,我不知道这种方法。
  • @Joni - 感谢您的回答。你是对的,我确实在这个类的字符串上做ToLower。我确实使用ToLowerInvariant - 但通常只用于用户直接输入或修改的数据。任何已修复的问题我仍然使用ToLower on...也许我应该重新考虑那个!听起来你已经一针见血了,我会改变它们,看看用户是否仍然有问题。再次感谢!
  • 这里有一篇关于这个问题的好文章:i18nguy.com/unicode/turkish-i18n.html
猜你喜欢
  • 2020-03-31
  • 2022-07-13
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多