Фактическая длина строки - PullRequest
0 голосов
/ 24 мая 2018

У меня есть string, который состоит из смеси китайских символов и отображаемых кодов ASCII.

string str = "Test測試123";

Когда я использую str.Length или str.ToCharArray(), все они возвращают китайский символ как каждый 1 символ !Что не соответствует действительности, потому что любой китайский символ является 2 байта !

Даже если я попытаюсь Encoding.ASCII.GetBytes(str), он просто даст мне 63 с в ALL китайские иероглифы !!!И это оказался тот же результат, что и Length или ToCharArray()!

Что является неправильным результатом для моей цели !!!

Есть ли какой-либоспособ получить фактическую длину строки!?

В приведенном мной примере: 11 вместо 9!?

1 Ответ

0 голосов
/ 24 мая 2018

Длина в мире Unicode - это всегда весело ... Какая длина вам нужна?Например:

string str = "?";

// Length in UTF-16 code units
int len = str.Length; // 2

// Length in bytes, if encoded in UTF16, as done by .NET
int len2 = str.Length * 2; // 4

// Length in bytes, if encoded in UTF8
int len3 = Encoding.UTF8.GetByteCount(str); // 4

// Length in unicode code points
int len4 = Encoding.UTF32.GetByteCount(str) / 4; // 1

Обратите внимание, что существует пятая длина: длина в кластере графем, которая еще более сложна для вычисления, поскольку некоторые кодовые точки могут «сливаться» вместе, а шестая: длина вколичество символов.

Теперь ваша строка имеет len, равную 9, len2, равную 18, len3 (поэтому длина в байтах, если преобразована в UTF8) равна 13, len4 равно 9.

Почти все китайские иероглифы находятся в базовой многоязычной плоскости стандарта Unicode, поэтому они имеют длину 1 единицы кода UTF-16 и могут отображаться на2 или 3 байта в UTF8.

Несколько интересных ссылок: В чем разница между символом, кодовой точкой, глифом и графемой?.

Ах ... и, пожалуйста, забудьте о Encoding.ASCII.Живи так, как будто его не существует.Это, вероятно, не то, что вы думаете.Даже если вы жили в старом мире MS DOS с его забавными персонажами, это не был ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...