首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在日语utf-8 kanji上使用java子字符串

如何在日语utf-8 kanji上使用java子字符串
EN

Stack Overflow用户
提问于 2015-04-07 23:09:10
回答 1查看 2K关注 0票数 2

可以使用子字符串从字符串中提取单个utf8 kanji吗?问题是utf-8“字符”的长度可以是1、2或3。

例如,"“的长度为6,因此String.substring(1,2)不能获得第一个完整字符。

在PERL中,我可以使用substr("",1,1)获得第一个字符,或者使用substr("",2,1)获取第二个字符。

更新:基于@msandiford的建议,我想出了这个。

代码语言:javascript
复制
public class SplitKanji {
    private String [] splitKanji;
    private SplitKanji(String string) {
        int cpCount = string.codePointCount(0, string.length());
        splitKanji = new String[cpCount];
        int nextSlot = 0;
        for (int i = 0; i < string.length();) {
            int ii = string.offsetByCodePoints(i, 1);
            splitKanji[nextSlot++] = string.substring(i, ii);
            i = ii;
        }
    }
    private String[] get() {
        return splitKanji;
    }
    public static void main(String[] args) {
        String startKanji = "私今日";
        SplitKanji myStuff = new SplitKanji(startKanji);
        String [] split = myStuff.get();
        System.out.print(startKanji + "=");
        for(String kanji: split)
            System.out.print(kanji + ":" + kanji.length() + ", ");
        System.out.println();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 23:34:46

您可以从String中提取单个Unicode代码点,如下所示:

代码语言:javascript
复制
  public static final String KANJI = "";

  public static void main(String[] args)
  {
    System.out.println(KANJI.length());                         // 6
    System.out.println(KANJI.codePointCount(0, KANJI.length()));// 3

    // Loop over each code point
    for (int i = 0; i < KANJI.length(); )
    {
      System.out.println(KANJI.codePointAt(i));
      i = KANJI.offsetByCodePoints(i, 1);
    }

    // Extract the third codepoint
    int indexForThirdCodePoint = KANJI.offsetByCodePoints(0, 2);
    int thirdCodePoint = KANJI.codePointAt(indexForThirdCodePoint);
    System.out.println(thirdCodePoint);

    // Convert codepoint back to string
    System.out.println(new String(Character.toChars(thirdCodePoint)));
  }

您可以使用上述技术获取所需代码点的开始和结束索引,然后使用substring(start, end)提取。

(编辑)所有这些都可以通过一些明智的重构和实用函数来简化。下面是一个可能的例子;我不知道您的代码的用例是什么,所以很难知道什么对您最好。

代码语言:javascript
复制
public static final String KANJI = "";

public static int lengthCodepoints(String s)
{
  return s.codePointCount(0, s.length());
}

public static String substringCodepoint(String s, int startCodepoint, int numCodepoints)
{
  int startIndex = s.offsetByCodePoints(0, startCodepoint);
  int endIndex = s.offsetByCodePoints(startIndex, numCodepoints);
  return s.substring(startIndex, endIndex);
}

public static void main(String[] args)
{
  int cpLength = lengthCodepoints(KANJI);
  for (int i = 0; i < cpLength; ++i)
  {
    System.out.println(substringCodepoint(KANJI, i, 1));
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29502983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档