我被赋予了生成UTF-8字符集中所有字符的任务,以测试系统如何处理它们。我对字符编码没有多少经验。接近我要尝试的是增加一个计数器,然后尝试将该十进制数转换为它的等效UTF-8字符,但到目前为止,我无法在C#3.5中找到一种有效的方法。 / p>
任何建议都将不胜感激。
答案 0 :(得分: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
}
}
上面的代码应该迭代当前分配的Unicode字符。您可能希望在本地解析UnicodeData文件并修复我所做的任何C#错误。
当前分配的Unicode字符集小于可以定义的集。当然,当你将其中一个字符打印出来时,你是否看到一个字符取决于很多其他因素,比如字体和它在发射到你的眼球之前会经过的其他应用程序。
答案 1 :(得分:7)
没有“UTF-8字符”。你的意思是Unicode字符或Unicode字符的UTF-8编码吗?
将int转换为Unicode字符很容易,当然还提供了该代码的映射:
char c = (char)theNumber;
如果你想要那个角色的UTF-8编码,那也不是很难:
byte[] encoded = Encoding.UTF8.GetBytes(c.ToString())
您必须检查Unicode标准,以查看定义了Unicode字符的数字范围。
答案 2 :(得分:5)
即使你生成了所有角色,你也会发现它不是一个有效的测试。一些字符是组合标记,这意味着它们将与下一个字符组合在一起 - 具有一个充满组合标记的字符串将没有多大意义。还有其他特殊情况。使用您需要支持的语言中的实际文本会更好。
答案 3 :(得分:2)
UTF-8不是字符 set - 它是一个字符 encoding ,它能够将Unicode字符集中的任何字符编码为二进制数据。
您能否提供有关您尝试做的更多信息?您可以编码所有可能的Unicode字符(包括当前未分配的字符),但如果您需要处理基本多语言平面之外的字符(即U + FFFF以上的字符),那么它会变得有点棘手... < / p>
答案 4 :(得分:1)
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
}
答案 5 :(得分:1)
这将为您提供字符集中的所有字符 - 只需确保在指定编码时指定字符集:
var results = new ConcurrentBag<int> ();
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<int> (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 ());
答案 6 :(得分:1)
您可以强制使用Encoding
来确定它支持的代码点。为此,只需浏览所有可能的代码点,将其转换为字符串,然后查看Encoding.GetBytes()
是否引发异常(将Encoding.EncoderFallback
设置为EncoderExceptionFallback
后)。
IEnumerable<int> 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
的代理对所代表的字符。但是,它非常慢(在我的机器上运行需要几分钟)并且可能不切实际。
答案 7 :(得分:0)
正如其他人所说,UTF / Unicode是一种编码,而不是字符集。
如果你浏览http://www.joelonsoftware.com/articles/Unicode.html,它应该有助于澄清unicode是什么。
答案 8 :(得分:0)
此代码将在文件中生成输出。所有可打印的字符都在那里。
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]);
}
}
}
答案 9 :(得分:0)
Powershell代码,我将Jake建议的代码所组成的行放到一个256行长的文本文件中。
服务符号会创建两个原始行中不存在的空白行,在Powershell处理之前,必须在原始文本文件中将其删除,以便正确创建结果文件。
我将在此处发布ASC2部分的外观。
NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS GS RS美国空间! “#$%&'()* +,-./ 0 1 2 3 4 5 6 7 8 9:; <=>?@ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _ _ abcdefghijklmnopqrstu vwxyz {|}〜PAD HOP BPH NBH IND NEL SSA ESA HTS HTJ VTS PLD PLU RI SS2 SS3 DCS PU1 PU2 STS CCH MW SPA EPA SOS SGCI SCI CSI ST OSC PM APC Non-breakingSpace¢¢¥¤§§¨©ª«¬®Â±±²³µ µ ¶·¸º»¼½¾¿ÀÇÇ×××××ØÛÛÜßç èéëííðñóóô÷÷ø÷úüý
在初始文件中,每个字符都将换行。
最好使用记事本++查看服务符号。最好用手将其替换为文本。
在asc2部分的下方和结尾处还包含两个服务符号-很多。
但是,要欣赏彩色的表情符号,您只需将自己喜欢的文本复制到Word或社交网络中即可。 Word比记事本更好地解释字符,但比网站更糟。
$arrayFromFile = [IO.File]::ReadAllLines('C:\utf-8.txt')
$counter = [pscustomobject] @{ Value = 0 }
$groupSize = 256
$text=''
$groups = $arrayFromFile | Group-Object -Property { [math]::Floor($counter.Value++ / $groupSize) }
foreach ($group in $groups){
$text+=$group.Group -join (' ')
$text+="`n"
}
$text | Out-File -FilePath 'C:\utf-8 (sorted).txt'