按代码点索引的Java子字符串(将代理代码单元对视为单个代码点)
我有一个小的演示应用程序,展示了当使用需要代理项对的unicode代码点(即不能用2个字节表示)时Java的子字符串实现的问题。我想知道我的解决方案是否有效,或者我是否遗漏了什么。我曾考虑过在codereview上发表文章,但这与Java的字符串实现比我的简单代码本身有更多的关系按代码点索引的Java子字符串(将代理代码单元对视为单个代码点),java,string,unicode,character-encoding,char,Java,String,Unicode,Character Encoding,Char,我有一个小的演示应用程序,展示了当使用需要代理项对的unicode代码点(即不能用2个字节表示)时Java的子字符串实现的问题。我想知道我的解决方案是否有效,或者我是否遗漏了什么。我曾考虑过在codereview上发表文章,但这与Java的字符串实现比我的简单代码本身有更多的关系 public class SubstringTest { public static void main(String[] args) { String stringWithPlus2Byte
public class SubstringTest {
public static void main(String[] args) {
String stringWithPlus2ByteCodePoints = "No need to walk to the beginIndex
twice:
public String codePointSubstring(String s, int start, int end) {
int a = s.offsetByCodePoints(0, start);
return s.substring(a, s.offsetByCodePoints(a, end - start));
}
公共类子字符串测试{
公共静态void main(字符串[]args){
String stringWithPlus2ByteCodePoints=“无需走到beginIndex
两次:
def codePointSubstring(s: String, begin: Int, end: Int): String = {
val a = s.offsetByCodePoints(0, begin)
s.substring(a, s.offsetByCodePoints(a, end - begin))
}
从这个Scala片段翻译过来:
我省略了IllegalArgumentException
s,因为它们似乎包含的信息并不比抛出的异常多。不是“大于2字节的unicode字符”,而是需要代理项对的unicode代码点。Java中的每个字符都是UTF-16(根据定义是2个字节,但这并不相关),但如果不使用代理项对,某些代码点就无法在UTF-16中表示。公平地说,我不确定术语。编辑标题/描述您正在计算代码点的偏移量,但您的输入会被测试,就好像beginIndex
和endIndex
是beginIndex>length | endInde>中的索引代码单元一样x>length
。你可能想要一些带有codePointCount
的东西。Codepoints是一种东西,但你确定你不想要吗?@TomBlodget哇,这只是一整罐蠕虫,不是吗?我个人只是在这个案例中进行实验,但在某些情况下看起来确实需要一些东西。