字符串到字符数组在Visual Studio和Android Studio中返回不同的结果

blu*_*hfx 15 c# java string visual-studio android-studio

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

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

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

Visual Studio调试信息

Android Studio调试信息

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

Jer*_*emy 15

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

此页面包含孟加拉语文本的不同规范化表单的图表 - 第四行描述了您正在看到的内容:

孟加拉桌

我现在只是在了解这一点,但在我看来,这样做的动机是,unicode实现可以在任何可能和实际的情况下与预先存在的编码保持兼容.

例如,一个预先存在的编码可能已经使用了单个unicode字符,而另一个预先存在的编码可能已经使用了两个字符组合.因此,unicode人员解决的解决方案是支持两者,代价是没有单一的"规范"表示,就像你在这里遇到的那样.

如果您希望在C#阵列似乎正在使用的"D"规范化表单下规范化Java数组,则此页面似乎提供了这样的功能.您可能正在寻找类似的东西:

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

Unicode标准附件15是描述这些规范化形式的官方文档.


And*_*eas 10

您必须以不同方式输入字符串.

文本?????是Unicode代码点09B7 09CD 099F 09CB 09B0,即2487 2509 2463 2507 2480,如您的C#所示.

Java显示的值,即2487 2509 2463 2503 2494 2480第四个字符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

它们组合了字符,并且有不同的方法来组合字符以获得相同的结果.

  • @bluetoothfx你是否将完全相同的字符串复制/粘贴到两者中,或者你输入了吗?因为,如果我将文本复制/粘贴到UTF-8编码的Java源文件中,**我得到长度为5.请参阅[IDEONE](http://ideone.com/GFvj3G)以获取证明**.Java不会自行重新规范化文本. (3认同)