有一个String变量,包含ascii字符和双字节字符(例如,中文,日文,......).
如何确定String的总长度?另外,我想用字符串substring/replace函数实现.
Java中的字符串类型隐式为UTF-16.所有其他编码(例如UTF-8)应使用byte数组表示.
"长度"是一个含糊不清的术语.
每个Unicode代码点将使用一个或两个代码单元(16位char) - 基本多语言平面和补充范围.当转码为不同的编码时,字符串将消耗的字节数可以改变.一系列代码点也可以组合形成单个用户可见的字形.
所以,这里有一些方法来衡量字符串的"长度":
我在博客文章中介绍了其中一些内容.
评论:是否有一种简单的方法/ API来处理混合字节字符串?(剪切/缩短/ substring()字符串如"sDDsssDDDDsDD"(s:单字节ascii字符,DD:双字节字符)?
考虑Java字符串文字"Hello ????",也可以表示为"Hello \u60a8\u597d\u4e16\u754c".
这可以在传统的Windows 简体中文双字节编码中编码为字节序列:
48 65 6c 6c 6f 20 c4 fa ba c3 ca c0 bd e7
Run Code Online (Sandbox Code Playgroud)
为了将其转换为Java字符,您可以对其进行解码:
byte[] data = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, (byte) 0xc4,
(byte) 0xfa, (byte) 0xba, (byte) 0xc3, (byte) 0xca, (byte) 0xc0,
(byte) 0xbd, (byte) 0xe7 };
Charset encoding = Charset.forName("x-mswin-936");
String hello = new String(data, encoding);
Run Code Online (Sandbox Code Playgroud)
现在您已将数据转码为Unicode,您可以使用通常的字符串操作机制(子字符串,正则表达式匹配等).
请注意,您必须知道转换前使用的双字节编码.如果您不知道编码,那么您所拥有的只是垃圾.
我不知道Android支持哪些编码,但您可以通过调用Charset.availableCharsets()在运行时发现这一点.如果Android不支持您需要的编码,请查看ICU4J库.
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |