【发布时间】:2011-08-19 16:11:24
【问题描述】:
我在 c# 中使用 Visual Studio 2010 将文本转换为 Unicode。就像我有一个字符串 abc= "मेरा" 。 此字符串中有 4 个字符。我需要所有四个 unicode 字符。 请帮帮我。
【问题讨论】:
标签: c# .net unicode ascii hindi
我在 c# 中使用 Visual Studio 2010 将文本转换为 Unicode。就像我有一个字符串 abc= "मेरा" 。 此字符串中有 4 个字符。我需要所有四个 unicode 字符。 请帮帮我。
【问题讨论】:
标签: c# .net unicode ascii hindi
当您编写像 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 位)代码点,这将为您提供它们。 (也许有更直接的解决方案,但我还没有找到。)
【讨论】:
var chars = abc.Select(c => (int)c);。
foreach 和Console.WriteLine() 将它们写出到控制台。
如果您有字符串s = मेरा,那么您已经有了答案。
此字符串包含 BMP 中的四个代码点,在 UTF-16 中由 8 个字节表示。您可以使用s[i]、foreach 循环等按索引访问它们。
如果你想要底层的 8 个字节,你可以这样访问它们:
string str = @"मेरा";
byte[] arr = System.Text.UnicodeEncoding.GetBytes(str);
由于 .Net char 是一个 Unicode 字符(至少对于 BMP 代码点而言),您可以简单地枚举字符串中的所有字符:
var abc = "मेरा";
foreach (var c in abc)
{
Console.WriteLine((int)c);
}
导致
2350
2375
2352
2366
【讨论】:
如果您尝试将文件从旧编码转换为 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。
【讨论】:
使用
System.Text.Encoding.UTF8.GetBytes(abc)
这将返回您的 unicode 值。
【讨论】: