【问题标题】:How to retrieve the unicode decimal representation of the chars in a string containing hindi text?如何检索包含印地语文本的字符串中字符的 unicode 十进制表示?
【发布时间】:2011-08-19 16:11:24
【问题描述】:

我在 c# 中使用 Visual Studio 2010 将文本转换为 Unicode。就像我有一个字符串 abc= "मेरा" 。 此字符串中有 4 个字符。我需要所有四个 unicode 字符。 请帮帮我。

【问题讨论】:

标签: c# .net unicode ascii hindi


【解决方案1】:

当您编写像 string abc= "मेरा"; 这样的代码时,您已经将它作为 Unicode(特别是 UTF-16),因此您不必进行任何转换。如果你想访问单数字符,你可以使用普通索引来做到这一点:例如abc[1](梵音元音符号 E)。

如果您想查看这些字符的数字表示,只需将它们转换为整数即可。例如

abc.Select(c => (int)c)

给出数字 2350、2375、2352、2366 的序列。如果您想查看这些数字的十六进制表示,请使用 ToString()

abc.Select(c => ((int)c).ToString("x4"))

返回字符串序列“092e”、“0947”、“0930”、“093e”。

请注意,当我说数字表示时,我实际上是指使用 UTF-16 进行编码。对于Basic Multilingual Plane 中的字符,这与它们的Unicode 代码点相同。绝大多数使用的字符都位于 BMP 中,包括这里介绍的 4 个印地语字符。

如果你也想处理其他平面的字符,你可以使用如下代码。

byte[] bytes = Encoding.UTF32.GetBytes(abc);

int codePointCount = bytes.Length / 4;

int[] codePoints = new int[codePointCount];

for (int i = 0; i < codePointCount; i++)
    codePoints[i] = BitConverter.ToInt32(bytes, i * 4);

由于 UTF-32 直接编码所有(21 位)代码点,这将为您提供它们。 (也许有更直接的解决方案,但我还没有找到。)

【讨论】:

  • 这就是我想要的。请告诉我如何使用 abc.Select(c => (int)c) 来获取变量中的 4 个值。
  • @Deepak,你是什么意思?其结果是具有这 4 个值的序列。如果您想将它们放入变量中,只需像使用任何其他代码一样执行var chars = abc.Select(c =&gt; (int)c);
  • 然后您可以使用foreachConsole.WriteLine() 将它们写出到控制台。
  • abc.Select() 给出错误,“字符串”不包含“选择”的定义...您如何运行此代码?
  • @ePandit 您可能缺少使用 System.Linq;在 C# 文件的顶部。
【解决方案2】:

如果您有字符串s = मेरा,那么您已经有了答案。

此字符串包含 BMP 中的四个代码点,在 UTF-16 中由 8 个字节表示。您可以使用s[i]foreach 循环等按索引访问它们。

如果你想要底层的 8 个字节,你可以这样访问它们:

string str = @"मेरा";
byte[] arr = System.Text.UnicodeEncoding.GetBytes(str);

【讨论】:

  • 字符串包含 4 个代码点,表示为 4 个chars 或 8 个字节。您的代码(修复后)返回一个 8 个字节的数组。
  • @svick 我只能看到 2 个代码点。你能解释一下 4 是从哪里来的吗?
  • @svick 看来我的印地语不太好!!我已经更正了我的答案。
  • 是的,渲染时,您只能看到两个字形。这是因为字符串包含两个非空格标记:U+0947U+093E
【解决方案3】:

由于 .Net char 是一个 Unicode 字符(至少对于 BMP 代码点而言),您可以简单地枚举字符串中的所有字符:

var abc = "मेरा";

foreach (var c in abc)
{
    Console.WriteLine((int)c);
}

导致

2350
2375
2352
2366

【讨论】:

    【解决方案4】:

    如果您尝试将文件从旧编码转换为 Unicode:

    读取文件,提供源文件的正确编码,然后使用所需的 Unicode 编码方案写入文件。

        using (StreamReader reader = new StreamReader(@"C:\MyFile.txt", Encoding.GetEncoding("ISCII")))
        using (StreamWriter writer = new StreamWriter(@"C:\MyConvertedFile.txt", false, Encoding.UTF8))
        {
            writer.Write(reader.ReadToEnd());
        }
    

    如果您正在寻找梵文字符到 Unicode 代码点的映射:

    您可以在Unicode Consortium 网站here 找到图表。

    请注意,Unicode 代码点传统上是用十六进制编写的。所以代码点不是十进制数 2350,而是写为 U+092E,在代码表上显示为 092E。

    【讨论】:

      【解决方案5】:

      使用

      System.Text.Encoding.UTF8.GetBytes(abc)
      

      这将返回您的 unicode 值。

      【讨论】:

      • 谢谢,但你能给我完整的代码,以便我可以将它存储在十六进制数字中。
      • 你错了。这不会返回“Unicode 值”,我假设您的意思是 Unicode 代码点。这将返回它们代表 UTF-8 中给定字符串的字节。
      • 请任何人帮助我获取 unicode 值,因为 म 的值是十进制的 2350。
      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2013-01-16
      • 2011-03-31
      • 2012-10-11
      • 1970-01-01
      • 2012-06-05
      • 2011-07-16
      相关资源
      最近更新 更多