Java 字符串类内部-如果使用UTF-8,则缓存字符偏移到字节的关系

Java 字符串类内部-如果使用UTF-8,则缓存字符偏移到字节的关系,java,python,objective-c,perl,utf-8,Java,Python,Objective C,Perl,Utf 8,在编写内部存储(以节省内存)而不是从头开始存储的自定义字符串类时,在应用程序使用具有随机访问的类时,在某种程度上缓存字节偏移量和字符偏移量之间的关系以提高性能是否可行 Perl是否对字符偏移量到字节偏移量的关系进行这种缓存?Python字符串如何在内部工作 那么Objective-C和Java呢?他们是否在内部使用UTF-8 编辑 在内部使用UTF-8找到对Perl 5的引用: “$flag=utf8::is_utf8(字符串) (从Perl 5.8.1开始)在内部测试字符串是否在UTF-8中。

在编写内部存储(以节省内存)而不是从头开始存储的自定义字符串类时,在应用程序使用具有随机访问的类时,在某种程度上缓存字节偏移量和字符偏移量之间的关系以提高性能是否可行

Perl是否对字符偏移量到字节偏移量的关系进行这种缓存?Python字符串如何在内部工作

那么Objective-C和Java呢?他们是否在内部使用UTF-8

编辑

在内部使用UTF-8找到对Perl 5的引用:

“$flag=utf8::is_utf8(字符串)

(从Perl 5.8.1开始)在内部测试字符串是否在UTF-8中。功能上与Encode::is_utf8()相同。”

第页

编辑

在我想到的应用程序中,字符串在XMPP流中有1-2K个XML节。大约1%的消息将包含50%(按字符计数)的大于127的Unicode值(这是XML)。在服务器中,对消息进行规则检查,并有条件地在一小部分字段(按字符体积)上路由。服务器是在服务器场中运行的Wintel Box。在客户机中,数据来自UI工具包,并输入到UI工具包中

编辑


但该应用程序不可避免地会发展,并希望进行一些随机访问。当这种情况发生时,性能影响是否可以最小化:我还感兴趣的是,是否存在一个更通用的类设计,例如管理大型UTF8字符串的字符偏移量字节偏移量关系的b-树(或在一般情况下被发现是有效的一些其他算法)。

我认为答案是:一般来说,这样做真的不值得。在你的具体情况下,也许

若您的大多数字符都是纯ASCII字符,并且很少有UTF序列,那个么构建某种带有偏移量的稀疏数据结构可能是值得的

在一般情况下,每个字符都可能是非ASCII字符,并且可能要存储许多偏移量。实际上,最常见的情况是创建一个与Unicode字符字符串一样长的字节字符串,并将每个字节值作为下一个字符的偏移量。但这意味着每个字符有一个完整的字节,因此每个Unicode字符只能净节省一个字节;可能不值得这么做。这意味着索引到字符串现在是一个O(n)操作,当您运行这些偏移量并求和它们以找到实际的索引时

如果您确实想尝试稀疏数据结构,我建议使用一个值对数组,第一个值是字符Unicode字符串中的索引,第二个值是该字符实际出现的字节序列中的索引。然后在每个UTF8转义序列之后,添加两个值以查找字符串中的下一个字符。最后,当给定一个Unicode字符的索引时,您的代码可以对此数组进行二进制搜索,以在稀疏数组中找到低于请求索引的最高索引,然后使用该索引查找表示所需字符开头的实际字节


如果需要保存内存,则可能需要考虑使用数据压缩库。将Unicode字符串作为完整的Unicode进行压缩;然后要索引到字符串中,首先要解压缩该字符串。这将真正节省内存,并且很容易快速地获得正确的代码以使其工作;但是它可能会增加太多的CPU开销,这是不合理的。

我认为答案是:一般来说,不值得尝试这样做。在你的具体情况下,也许

若您的大多数字符都是纯ASCII字符,并且很少有UTF序列,那个么构建某种带有偏移量的稀疏数据结构可能是值得的

在一般情况下,每个字符都可能是非ASCII字符,并且可能要存储许多偏移量。实际上,最常见的情况是创建一个与Unicode字符字符串一样长的字节字符串,并将每个字节值作为下一个字符的偏移量。但这意味着每个字符有一个完整的字节,因此每个Unicode字符只能净节省一个字节;可能不值得这么做。这意味着索引到字符串现在是一个O(n)操作,当您运行这些偏移量并求和它们以找到实际的索引时

如果您确实想尝试稀疏数据结构,我建议使用一个值对数组,第一个值是字符Unicode字符串中的索引,第二个值是该字符实际出现的字节序列中的索引。然后在每个UTF8转义序列之后,添加两个值以查找字符串中的下一个字符。最后,当给定一个Unicode字符的索引时,您的代码可以对此数组进行二进制搜索,以在稀疏数组中找到低于请求索引的最高索引,然后使用该索引查找表示所需字符开头的实际字节


如果需要保存内存,则可能需要考虑使用数据压缩库。将Unicode字符串作为完整的Unicode进行压缩;然后要索引到字符串中,首先要解压缩该字符串。这将真正节省内存,并且很容易快速地获得正确的代码以使其工作;但是它可能会增加太多的CPU开销,这是不合理的。

Java的字符串在内部是UTF-16:

字符串表示UTF-16格式的字符串,其中补充字符由代理项对表示(有关详细信息,请参阅字符类中的Unicode字符表示一节)。索引值引用字符代码单位,因此补充字符使用字符串中的两个位置


Java的字符串在内部是UTF-16:

字符串表示UTF-16格式的字符串,补充