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

2022-09-03 13:01:08

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

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

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

Visual Studio Debugging info

Android Studio Debugging info

N:B:我的 Android Studio IDE 和 Project Encoding 是 UTF-8。我期待与Android Studio中的Visual Studio相同的结果。


答案 1

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

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

Bengali table

我现在才开始了解这一点,但在我看来,这样做的动机是为了让 unicode 实现在可能和实用的情况下与预先存在的编码保持兼容。

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

如果您希望在 C# 数组似乎正在使用的“D”规范化形式下对 Java 数组进行规范化,则此页面似乎提供了这样的函数。您可能正在寻找类似的东西:

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

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


答案 2

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

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

Java 显示的值,即 具有第 4 个字符 / 作为两个字符 / 。2487 2509 2463 2503 2494 2480250709CB2503 249409C7 09BE

查一下,他们是:

ো ↔ '孟加拉语元音符号O' (U+09CB)

与。

ে ↔ '孟加拉语元音符号 E' (U+09C7)
া ↔ '孟加拉语元音符号 AA' (U+09BE)

它组合出来是同样的事情:

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

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