【问题标题】:String to character array returning different result in Visual Studio and Android Studio字符串到字符数组在 Visual Studio 和 Android Studio 中返回不同的结果
【发布时间】:2017-04-04 20:53:38
【问题描述】:

我要转换为字符数组的字符串是ষ্টোর,它是Unicode和孟加拉语单词。

问题是当我在 Visual Studio 中转换它时,它返回 6 个字符,但是当我在 Android Studio 中转换它时然后显示 5 个字符

在 VS 我使用 char[] arrayOfChars = someString.ToCharArray(); 和 Android Studio char[] arrayOfChars = someString.toCharArray();

N:B:我的 Android Studio IDE 和项目编码是 UTF-8。我期待与 Android Studio 中的 Visual Studio 相同的结果。

【问题讨论】:

  • 您是否使用不同的运行时?
  • @minus 我不确定运行时。我只是在 VS 和 app studio 中编译它并得到 2 个不同的结果。如果您想谈论操作系统,那么我在 Linux Mint 中运行 App Studio,在 Windows 10 中运行 VS。
  • 我假设您在 Android Studio IDE 中使用 Java,在 Visual Studio 中使用 C#。你需要更清楚地说明这一点。如果您查看此图表symbolcodes.tlt.psu.edu/bylanguage/bengalichart.html,您会发现这些字符是应用于另一个字母的变音符号。 2507 包含与 2503 和 2494 表示的相同的两个变音符号,因此 2507 更有效但基本相同。两者都是从 UTF-16 转换而来的,所以也许它们只是以不同的方式转换为 UTF-8。
  • 我对这个问题和所有答案都非常着迷,这些答案显示了将符号与字节表示匹配的看似微不足道的问题有多深。我知道这一切(理论上),但我从来没有机会在实践中看到它。这就像只在图片中看到一幅画后去博物馆看一幅画。谢谢大家!

标签: java c# string visual-studio android-studio


【解决方案1】:

这两个数组是unicode equivalent,但用不同的规范化形式表示。似乎正在发生的事情是 Java ToCharArray(或字符串表示)正在使用一种规范化形式,而 C# ToCharArray(或字符串表示)正在使用另一种。

This page 包含孟加拉语文本的不同规范化形式的图表 - 第四行准确地描述了您所看到的内容:

我现在才知道这一点,但在我看来,这样做的动机是为了让 unicode 实现尽可能与预先存在的编码保持兼容。

例如,一种预先存在的编码可能使用了单个 unicode 字符,而另一种预先存在的编码可能反而使用了两个字符的组合。因此,unicode 人员确定的解决方案是同时支持两者,但代价是没有一个“规范”表示,正如您在此处遇到的那样。

如果您希望您的 Java 数组在您的 C# 数组似乎正在使用的“D”规范化形式下进行规范化,那么 this page 似乎提供了这样的功能。您可能正在寻找类似的东西:

someString = Normalizer.normalize(someString, Normalizer.Form.NFD);

Unicode standard annex 15是描述这些规范化形式的官方文档。

【讨论】:

  • Normalizer.normalize(someString, Normalizer.Form.NFD);线就是答案:)。感谢您的付出:)
  • 更准确地说,Unicode 旨在“往返兼容”,这意味着进出 Unicode 的编码应该产生与直接转码完全相同的位模式。 (或者,在相同编码的情况下,什么都不做。)
【解决方案2】:

您输入的字符串一定是不同的。

文本 ষ্টোর 是 Unicode 代码点 09B7 09CD 099F 09CB 09B0,即 2487 2509 2463 2507 2480,如 C# 所示。

Java显示的值,即2487 2509 2463 2503 2494 2480,第4个字符2507/09CB作为2503 2494/09C7 09BE这两个字符。

查找它们,它们是:

ো ↔ 'BENGALI VOWEL SIGN O' (U+09CB)

对比

ে ↔ 'BENGALI VOWEL SIGN E' (U+09C7)
া ↔ 'BENGALI VOWEL SIGN AA' (U+09BE)

结合起来就是同一件事:

ষ্টোর ↔ 09B7 09CD 099F 09CB 09B0
ষ্টোর ↔ 09B7 09CD 099F 09C7 09BE 09B0

他们是combining characters,并且有不同的方式来组合字符以获得相同的结果。

【讨论】:

  • 哇很多信息。谢谢安德烈亚斯。但我想像对待 VS 在 android studio 中对待它一样对待这个字符串 :)。我认为这将得到解决。但我不知道怎么做。但再次非常感谢:)
  • @bluetoothfx 求解取决于文本的来源。您只显示结果,但文本的来源可能是问题所在。除非您明确要求更改规范表示,否则 Java(我猜是 C#)将简单地保留它们给出的任何表示。
  • 我正在使用 ("ষ্টোর") 字符串。相同的源但不同的IDE。 app studio 在 linux mint 上运行,与在 win10 上运行。
  • @bluetoothfx 您是否将完全相同的字符串复制/粘贴到两者中,还是您输入了?因为,如果我将文本复制/粘贴到 UTF-8 编码的 Java 源文件中,我得到的长度为 5。请参阅 IDEONE 以获得证明。 Java 不会自行重新规范化文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多