Я использую этот код для генерации U+10FFFC
var s = Encoding.UTF8.GetString(new byte[] {0xF4,0x8F,0xBF,0xBC});
Я знаю это для частного использования и т.д., но он отображает один символ, как я ожидал бы при его отображении. Проблемы возникают при манипулировании этим символом юникода.
Если я потом сделаю это:
foreach(var ch in s)
{
Console.WriteLine(ch);
}
Вместо того, чтобы печатать только один символ, он печатает два символа (т.е. строка, по-видимому, состоит из двух символов). Если я изменю свой цикл, чтобы добавить эти символы в пустую строку, например:
string tmp="";
foreach(var ch in s)
{
Console.WriteLine(ch);
tmp += ch;
}
В конце этого, tmp
будет печатать только один символ.
Что именно здесь происходит? Я думал, что char
содержит один символ Юникода, и мне никогда не приходилось беспокоиться о том, сколько байтов имеет символ, если я не делаю преобразование в байты. Мой реальный прецедент - я должен уметь обнаруживать, когда в строке используются очень большие символы Юникода. В настоящее время у меня есть что-то вроде этого:
foreach(var ch in s)
{
if(ch>=0x100000 && ch<=0x10FFFF)
{
Console.WriteLine("special character!");
}
}
Однако из-за этого разделения очень больших символов это не работает. Как я могу изменить это, чтобы заставить его работать?