3

给定这个字符串

你好水</p>

图例:http ://en.wikipedia.org/wiki/UTF-16

 is 4 bytes
水 is 2 bytes

Postgresql 数据库 (UTF-8) 返回正确的长度 7:

select length('HELLO水');

我注意到 .NET 和 Java 都返回 8:

Console.WriteLine("HELLO水");

System.out.println("HELLO水");

Sql Server 也返回 8:

SELECT LEN('HELLO水');

当给定的 unicode 字符不是可变长度时,.NET、Java 和 Sql Server 返回正确的字符串长度,它们都返回 6:

  HELLO水

他们为可变长度返回 7,这是不正确的:

  HELLO

.NET、Java 和 Sql Server 使用 UTF-16。似乎他们计算 UTF-16 字符串长度的实现被破坏了。或者这是 UTF-16 规定的?UTF-16 作为其 UTF-8 表亲具有可变长度能力。但是为什么 UTF-16(或者是 .NET、Java、SQL Server 等等的错?)不能像 UTF-8 那样正确计算字符串的长度?


Python 返回长度为 12,但我不知道如何解释它返回 12 的原因。这可能完全是另一个话题,我离题了。

len("HELLO水")

问题是,如何在 .NET、Java 和 Sql Server 上获得正确的字符数?如果函数返回不正确的字符数,则很难实现下一个 twitter。

如果我可以添加,我无法使用 Firefox 发布此内容。我在谷歌浏览器中发布了这个问题。Firefox 无法显示可变长度的 unicode

4

3 回答 3

4

C#(可能还有 SQL 和 Java)正在返回字符串中的 Char 元素数。

字符串长度

Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。原因是一个 Unicode 字符可能由多个 Char 表示。使用 System.Globalization.StringInfo 类来处理每个 Unicode 字符而不是每个 Char。

于 2012-05-08T02:39:54.640 回答
3

在 Java 中:

String s = "HELLO水";
System.out.println(s.codePointCount(0, s.length())); // 7
System.out.println(s.length()); // 8
于 2012-05-08T03:04:12.993 回答
0

.Net:String.Length 属性

Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。原因是一个 Unicode 字符可能由多个 Char 表示。使用 System.Globalization.StringInfo 类来处理每个 Unicode 字符而不是每个 Char。

所以我们应该使用 StringInfo 类来获取正确的 Unicode 字符数。

String s = "HELLO水";
Console.WriteLine (s);
Console.WriteLine ("Count of char: {0:d}", s.Length);

StringInfo info = new StringInfo (s);
Console.WriteLine ("Count of Unicode characters: {0:d}", info.LengthInTextElements);

输出:

你好水<br> 字符数:8
Unicode 字符数:7

于 2015-04-11T16:46:33.283 回答