【问题标题】:How to get string's byte length? [duplicate]如何获取字符串字节长度? [复制]
【发布时间】:2017-08-05 20:46:51
【问题描述】:

我有一个这样的字符串:

string a1 = "{`name`:`санкт_петербург`,`shortName`:`питер`,`hideByDefault`:false}";

a1. length 显示字符串长度为 68,这是不正确的:西里尔符号的大小是原来的两倍(我猜是因为 UTF-16 编码),因此这个字符串的实际长度87

我需要获取字符串中西里尔符号的数量或以任何其他方式获取实际字符串长度。

【问题讨论】:

  • 所有 .NET 字符串都是 UTF16。 所有 字符的长度为 2 个字节。 .Length 返回字符数,而不是字节数。该字符串有 68 个字符,占用 136 个字节
  • Encoding.GetByteCount 呢?
  • 即使使用“ASCII”字符,长度和大小也保持不变。对于name,长度为4,使用8个字节。
  • @PanagiotisKanavos 实际上,UTF16 中的所有字符都不是 2 个字节长。有些更长。
  • @MatthewWatson 通常使用表情符号和中文。在亚洲以外遇到的最常见的情况是 2 个字节 - 除非你是塔科马机场,那里所有的公告也是中文

标签: c# string encoding


【解决方案1】:

来自MSDN

.NET Framework 使用 UTF-16 编码(由 UnicodeEncoding 类表示)来表示字符和字符串

所以a1.Length 是 UTF-16 代码单元 (What's the difference between a character, a code point, a glyph and a grapheme?)。位于基本 BMP(基本多语言平面)中的西里尔字符都使用单个代码单元(因此单个 char)。例如,许多表情符号使用两个代码单元(两个 char,4 个字节!)......它们不在 BMP 中。参见例如https://ideone.com/ASDORp

如果您想要以字节为单位的大小,a1.Length * 2 显然是长度 :-) 如果您想知道 UTF8(一种非常常见的编码,.NET 内部不使用,但 web、xml、 ...) 多少字节 Encoding.UTF8.GetByteCount(a1)

【讨论】:

  • 2 个字节,对吧?不是 2 个字符。
  • 是的,Encoding.UTF8.GetByteCount(a1) 有效。谢谢。
  • @PatrickHofman 新的表情符号是 2 个字符,4 个字节例如? 是 2xchars。见ideone.com/ASDORp
  • @MrScapegrace 有什么用?您不能将 UTF8 和 UTF16 混合在一个字符串中,它们始终是 UTF16。您对字符串长度的假设是错误的。 Encoding.UTF8.GetByteCount() 如果首先将整个字符串从 UTF16 转换为 UTF8,则返回以字节为单位的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2019-09-02
  • 1970-01-01
  • 2013-08-01
  • 2012-04-09
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多