c# - 字符串的实际长度

标签 c# string size ascii

我有一个字符串,它由汉字和可显示的ASCII码混合组成。

string str = "Test測試123";

当我使用str.Lengthstr.ToCharArray() 时,它们都以1 个字符 的形式返回汉字!这不是真的,因为任何汉字都是 2 字节!

即使我尝试 Encoding.ASCII.GetBytes(str),它也只会给我 ALL 汉字中的 63!! !结果与 LengthToCharArray() 的结果相同!

就我的目的而言,哪个是错误的结果!!!

有什么方法可以获取字符串的实际长度!?

在我刚刚给出的例子中:11 而不是 9!?

最佳答案

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 等于 9len2 等于 18len3 (如果转换为 UTF8,则以字节为单位的长度)等于 13len4 等于 9。

几乎所有的汉字都在Unicode标准的Basic Multilingual Plane中,所以它们的长度为1个UTF-16编码单元,在UTF8中它们可以映射到2或3个字节。

一些有趣的引用:What's the difference between a character, a code point, a glyph and a grapheme? .

啊...请忘记 Encoding.ASCII。像它不存在一样生活。它可能不是你想的那样。即使您生活在充满有趣字符的旧 MS DOS 世界中,那也不是 ASCII。

关于c# - 字符串的实际长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506915/

相关文章:

c# - 基于 c# 中的用户输入解析为原始类型

c# - 从 Sharepoint 流式传输 WCF

c# - 如何在项目开始时执行迁移

javascript - 初始化 jQuery 函数并传递带有字符串的变量

size - 如何让 graphviz 生成固定大小的子图?

c# - 为什么我的 JavaScriptSerializer 返回空的 json 对象?

JavaScript 字符串子类化问题

c - 过滤字符串中连续重复的字符

c++ - std::map 按值的大小排序 (set<int>)

windows - delphi - 计算目录大小API?