2017-04-21 1 views
2

내 안드로이드 앱의 문제는 이모티콘이 포함 된 문자열의 길이를 계산할 때 이모티가 둘 이상의 문자로 간주된다는 것입니다. iOS 버전이있는 앱의 Android 버전에서 작업하고 있습니다. iOS에서는 각 그림이 하나의 문자로 계산됩니다. iOS 앱에서 색인이 반환되면 각 그림이 하나의 것으로 간주됩니다.emojis를 한 문자로만 계산하여 문자열의 올바른 문자 색인을 얻습니다.

"안녕 난 사랑 @team"

내가 가지고있는 정보 만이 어쩌면 14 또는 15를 안드로이드에, 13 아이폰 OS에 의해 지정된 인덱스 때 나는 @team의 인덱스를 좀하고 싶습니다

답변

1

생각 나는 2 개의 upvotes가 있었기 때문에 나는 나의 대답을 게시해야한다.

iOS 색인을 "실제"로, android의 색인을 "위조"로 사용하는 것이 가장 좋았으며, 이로 인해 모든 것을 iOS 색인으로 변환해야했습니다. graphemeGetIndex는 Java "가짜"색인에서 iOS "실제"색인을 가져오고 grahemeGetLength는 필요한 경우 "실제"길이를 가져옵니다. 당신이

public static int graphemeLength(String s) { 
     BreakIterator it = BreakIterator.getCharacterInstance(); 
     it.setText(s); 
     int count = 0; 
     while (it.next() != BreakIterator.DONE) { 
      count++; 
     } 
     return count; 
    } 

public static int graphemeGetIndex(String wholeString, int mIndex) { 
    BreakIterator it = BreakIterator.getCharacterInstance(); 
    int realStartIndex = 0; 
    if (mIndex >= 0) { 
     String partString = wholeString.substring(0, mIndex); 
     it.setText(partString); 
     while (it.next() != BreakIterator.DONE) { 
      realStartIndex++; 
     } 
    } 
    return realStartIndex; 
} 

private void recalculateIndices() { 
     for (final UserMention mention : mMentions) { 
      final int startFake = mCurrentText.indexOf("@" + mention.getName()); 
      final int startReal = graphemeGetIndex(mCurrentText, startFake); 
      mention.setRealIndices(new int[]{startReal, startReal + graphemeLength(mention.getName())}); 
      mention.setJavaFakeIndices(new int[]{startFake, startFake + mention.getName().length()}); 
     } 
    } 
1

이 답변은 코드 포인트에 대한 자바의 유니 코드 지원을 사용하도록 제안 질문이있는 경우

는 문의하십시오.

그림 이모티콘 심볼 (자모)는 유니 코드 코드 포인트이다. Java는 내부적으로 유니 코드도 사용하지만 일반적으로 (UTF-16) char은 2 바이트 코드이며 이모티콘은 유니 코드 번호가 훨씬 높은 코드 포인트를 사용합니다. 따라서 java는 여러 문자를 사용합니다. 시작은 emojis입니다.

하지만 자바에서 코드 포인트를 사용할 수 있습니다. Java 8에는 몇 가지 추가 도움이 있습니다. 안드로이드가 이미 일부 기능을 다하기를 바랍니다.

final int RAISED_EYEBROW = 0x1f928; // U+1F928. 
String s = new String(new int[] {RAISED_EYEBROW}, 0, 1); 

발견 : 유니 코드 코드 포인트를 사용하여, 이모티콘에서 문자열을 만들기

int codePointsLength(String s) { 
    int n = 0; 
    for (int i = 0; i < s.length();) { 
     int codePoint = s.codePointAt(i); 
     i += Character.charCount(codePoint); 
     ++n; 
    } 
    return n; 
} 

int codePointsLength(String s) { 
    return (int) s.codePoints().count(); // Java 8. 
} 

:

코드 포인트의 길이를 촬영 코드 포인트로 인덱싱 된 문자열의 위치 :

int codePointIndexOf(String s, int codePoint) { 
    int n = 0; 
    for (int i = 0; i < s.length();) { 
     int cp = s.codePointAt(i); 
     if (cp == codePoint) { 
      return n; 
     } 
     i += Character.charCount(cp); 
     ++n; 
    } 
    return -1; 
} 

// Java 9 takeWhile. 
int codePointIndexOf(String s, int codePoint) { 
    int totalCount = (int) s.codePoints().count(); 
    int count = (int) s.codePoints().takeWhile(cp -> cp != codePoint).count(); 
    return count >= totalCount ? -1 : count; 
} 
관련 문제