如何在.net中生成UTF-8字符集中的所有字符

Fir*_*ire 16 .net c# utf-8 character-encoding

我被赋予了生成UTF-8字符集中所有字符的任务,以测试系统如何处理它们.我对字符编码没有多少经验.接近我要尝试的是增加一个计数器,然后尝试将该十进制数转换为它的等效UTF-8字符,但到目前为止,我还没有找到一种有效的方法来实现这一点.

任何建议将不胜感激.

McD*_*ell 8

System.Net.WebClient client = new System.Net.WebClient();
string definedCodePoints = client.DownloadString(
                         "http://unicode.org/Public/UNIDATA/UnicodeData.txt");
System.IO.StringReader reader = new System.IO.StringReader(definedCodePoints);
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
while(true) {
  string line = reader.ReadLine();
  if(line == null) break;
  int codePoint = Convert.ToInt32(line.Substring(0, line.IndexOf(";")), 16);
  if(codePoint >= 0xD800 && codePoint <= 0xDFFF) {
    //surrogate boundary; not valid codePoint, but listed in the document
  } else {
    string utf16 = char.ConvertFromUtf32(codePoint);
    byte[] utf8 = encoder.GetBytes(utf16);
    //TODO: something with the UTF-8-encoded character
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码应该迭代当前分配的Unicode字符.您可能希望在本地解析UnicodeData文件并修复我所做的任何C#错误.

当前分配的Unicode字符集小于可以定义的集.当然,当你打印出其中一个角色时,你是否看到一个角色取决于很多其他因素,比如字体和它在发射到你的眼球之前会经过的其他应用程序.


Guf*_*ffa 7

没有"UTF-8字符".你的意思是Unicode字符或Unicode字符的UTF-8编码?

将int转换为Unicode字符很容易,当然还提供了该代码的映射:

char c = (char)theNumber;
Run Code Online (Sandbox Code Playgroud)

如果你想要那个字符的UTF-8编码,那也不是很难:

byte[] encoded = Encoding.UTF8.GetBytes(c.ToString())
Run Code Online (Sandbox Code Playgroud)

您必须检查Unicode标准以查看定义了Unicode字符的数字范围.


Mar*_*som 5

即使你生成了所有角色,你也会发现它不是一个有效的测试.一些角色是组合标记,这意味着它们将与下一个角色结合在一起 - 拥有一个充满组合标记的字符串将没有多大意义.还有其他特殊情况.在您需要支持的语言中使用实际文本会更好.


Jon*_*eet 2

UTF-8 不是字符- 它是一种字符编码,能够将 Unicode 字符集中的任何字符编码为二进制数据。

您能否提供有关您正在尝试做什么的更多信息?您可以对所有可能的 Unicode 字符(包括目前未分配的字符)进行编码,但如果您需要处理基本多语言平面之外的字符(即 U+FFFF 之上的字符),那么它会变得稍微棘手......