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

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

任何建议将不胜感激。

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 } } 

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

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

没有“UTF-8字符”。 你的意思是Unicode字符或Unicode字符的UTF-8编码?

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

 char c = (char)theNumber; 

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

 byte[] encoded = Encoding.UTF8.GetBytes(c.ToString()) 

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

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

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

你能提供一些关于你想做什么的更多信息吗? 您可以对所有可能的Unicode字符进行编码(包括当前未分配的字符),但如果您需要处理基本多语言平面之外的字符(即U + FFFF以上的字符),那么它会变得有点棘手……

UTF-8不是字符集,它是一种编码。 Unicode中的任何值都可以使用不同的字节长度以UTF-8编码。

对于.net,字符是16位(它不是完整的unicode集,但是最实用的),所以你可以试试这个:

  for (char i = 0; i < 65536; i++) { string s = "" + i; byte[] bytes = Encoding.UTF8.GetBytes(s); // do something with bytes } 

这将为您提供字符集中的所有字符 – 只需确保在指定编码时指定字符集:

 var results = new ConcurrentBag (); Parallel.For (0, 10, set => { var encoding = Encoding.GetEncoding ("ISO-8859-1"); var c = encoding.GetEncoder (); c.Fallback = new EncoderExceptionFallback (); var start = set * 1000; var end = start + 1000; Console.WriteLine ("Worker #{0}: {1} - {2}", set, start, end); char[] input = new char[1]; byte[] output = new byte[5]; for (int i = start; i < end; i++) { try { input[0] = (char)i; c.GetBytes (input, 0, 1, output, 0, true); results.Add (i); } catch { } } }); var hashSet = new HashSet (results); //hashSet.Remove ((int)'\r'); //hashSet.Remove ((int)'\n'); var sorted = hashSet.ToArray (); Array.Sort (sorted); var charset = new string (sorted.Select (i => (char)i).ToArray ()); 

您可以强制执行Encoding以确定它支持的代码点。 为此,只需遍历所有可能的代码点,将它们转换为字符串,然后查看Encoding.GetBytes()抛出exception(在将Encoding.EncoderFallback设置为EncoderExceptionFallback )。

 IEnumerable GetAllWritableCodepoints(Encoding encoding) { encoding = Encoding.GetEncoding(encoding.WebName, new EncoderExceptionFallback(), new DecoderExceptionFallback()); var i = -1; // Docs for char.ConvertFromUtf32() say that 0x10ffff is the maximum code point value. while (i != 0x10ffff) { i++; var success = false; try { encoding.GetByteCount(char.ConvertFromUtf32(i)); success = true; } catch (ArgumentException) { } if (success) { yield return i; } } } 

此方法应支持发现由.net中的Char代理对表示的Char 。 但是,它非常慢(在我的机器上运行需要几分钟)并且可能不切实际。

正如其他人所说,UTF / Unicode是一种编码而不是字符集。

如果你浏览http://www.joelonsoftware.com/articles/Unicode.html它应该有助于澄清unicode是什么。

此代码将在文件中生成输出。 所有可打印或不打印的字符都在那里。

 Encoding enc = (Encoding)Encoding.GetEncoding("utf-8").Clone(); enc.EncoderFallback = new EncoderReplacementFallback(""); char[] chars = new char[1]; byte[] bytes = new byte[16]; using (StreamWriter sw = new StreamWriter(@"C:\utf-8.txt")) { for (int i = 0; i <= char.MaxValue; i++) { chars[0] = (char)i; int count = enc.GetBytes(chars, 0, 1, bytes, 0); if (count != 0) { sw.WriteLine(chars[0]); } } }