微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么.NET“ de-CH”区域性数字组分隔符在本地和Azure上不同?

如何解决为什么.NET“ de-CH”区域性数字组分隔符在本地和Azure上不同?

在本地桌面和Azure中运行时,我看到一个不同的Unicode字符作为“ de-CH”文化的数字组分隔符。

当以下代码在.NET Core 3.1或.NET Framework 4.7.2的桌面上运行时,它输出2019看起来像撇号,但并不相同。

在Azure中运行时,例如在https://try.dot.net中运行,或者在.NET Core 3.1(基于Windows的App Service)上运行的Azure函数中(进行了稍微修改),它会生成0027(标准) ASCII撇号。

using System;
using System.Linq;
using System.Globalization;

Console.WriteLine(((int)(CultureInfo
    .GetCultureInfo("de-CH")
    .NumberFormat
    .NumberGroupSeparator
    .Single())) // Just getting the single character as an int
    .ToString("X4") // unicode value of that character
    );

其结果是,尝试使用“ de-CH”区域性在本地桌面上解析字符串4'200.000(撇号为Unicode 0027),但是在Azure中有效。

为什么有区别?

解决方法

Shawn Steele的这个Microsoft博客解释了为什么您不应该依赖稳定的特定文化设置(引用完整,因为它在MSDN上不再在线)

https://web.archive.org/web/20190110065542/https://blogs.msdn.microsoft.com/shawnste/2005/04/05/culture-data-shouldnt-be-considered-stable-except-for-invariant/

CultureInfo和RegionInfo数据代表文化,区域,管理员 或用户对文化设置的偏好。申请不应 做出任何依赖于此数据稳定的假设。唯一的 例外(这是一条规则,所以当然会有例外) CultureInfo.InvariantCulture。 CultureInfo.InvariantCulture是 即使在版本之间也应该保持稳定。

文化数据会发生变化的原因很多。与惠德比 和“自定义文化”列表会更长一些。

  • 最明显的原因是数据中存在错误,我们必须进行更改。 (信不信由你,我们会犯错;-))在这种情况下,我们的用户(以及您的用户)都希望在文化上正确的数据,因此即使该错误会破坏现有应用程序,我们也必须予以修复。
  • 另一个原因是文化偏好会发生变化。发生这种情况的方式有很多,但确实发生了:
    • 全球意识,跨文化交流,计算机角色的变化等都可能影响文化偏好。
    • 国际条约,贸易等可以改变价值。欧元的采用将许多国家的货币符号更改为€。
    • 国家或地区法规也会影响这些价值。
    • 首选的单词拼写可能会随着时间而变化。
    • 首选日期格式等可以更改。
  • 一种文化可能存在多种偏好。然后,首选的最佳选择会随着时间而改变。
  • 用户可能已覆盖某些值,例如日期或时间格式。可以在不使用用户替代的情况下请求这些,但是我们建议应用程序考虑使用用户替代。
  • 用户或管理员本可以创建替换区域性,用特定于公司,区域或其他标准数据变体替换区域性的通用默认值。
    • 某些文化的偏好可能会因设置而异。与网吧相比,企业的形式可能更正式。
    • 企业可能要求整个组织使用特定的日期格式或时间格式。
  • 同一自定义区域性的不同版本,或在一台计算机上自定义的版本,而另一台计算机上仅Windows的区域性。

因此,如果您格式化具有特定日期/时间格式的字符串,然后 稍后尝试解析,如果版本更改, 计算机已更改,如果框架版本已更改(更新数据),或者 自定义文化已更改。如果您需要将数据保留在 可靠的格式,选择二进制方法,提供您自己的格式或 使用InvariantCulture。

即使不更改数据,记住使用不变式仍然是 好主意。如果你有不同。和,语法类似于 1,000.29,那么如果客户期望解析可能会感到困惑 1.000,29。我已经看到了一些应用程序的问题,这些应用程序没有意识到用户的文化与开发人员的文化会有所不同 文化。使用不变式或其他技术可以解决此类问题 问题。

当然不能为当前用户同时显示“正确”的内容 如果文化数据发生变化,还可以进行完美的往返。所以一般 我建议使用InvariantCulture或其他持久化数据 格式,并且始终使用适当的格式API 显示。您的应用程序将有其自己的要求,因此请考虑 小心点。

请注意,对于排序规则(排序顺序/比较),即使是不变的 行为可以改变。您需要使用“排序版本控制”来获取 如果您需要始终稳定的排序顺序,就可以解决。

如果您需要自动分析格式化为用户友好格式的数据,则有两种方法:

  • 允许用户明确指定使用的格式。
  • 首先尝试从字符串中删除除数字,减号和小数点分隔符之外的所有字符,然后再尝试对此进行解析。请注意,您首先需要知道正确的十进制分隔符。无法正确猜测,错误猜测可能会导致重大问题。

在任何可能的情况下,都应尽量避免解析被格式化为用户友好格式的数字。而是尽可能尝试以严格定义的(不变的)格式请求数字。

,

关于您的问题,我进行了一系列测试。

当前调查进度:

问题:区域性信息在WebApp Windows中返回错误的值(0027)。

调查进度:

为同一操作系统设置测试环境,确认该值由底层操作系统返回,并确认0027应该是此操作系统下的正确返回值。

下图显示了用2019和0027表示的字符,它们都表示撇号。

enter image description here

enter image description here

您可以参考以下文档:https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。