Skip to content

Instantly share code, notes, and snippets.

@hoshi-takanori
Last active March 15, 2016 07:04
Show Gist options
  • Select an option

  • Save hoshi-takanori/07bc363208ea0ba1382e to your computer and use it in GitHub Desktop.

Select an option

Save hoshi-takanori/07bc363208ea0ba1382e to your computer and use it in GitHub Desktop.
Surrogate pair index conversion in Java.
public class SurrogatePair {
public static int convertToUTF16Index(String str, int index) {
int result = 0;
for (int i = 0; i < index && result < str.length(); i++, result++) {
if (result + 1 < str.length() &&
Character.isSurrogatePair(str.charAt(result), str.charAt(result + 1))) {
result++;
}
}
return result;
}
public static int convertFromUTF16Index(String str, int index) {
int result = 0;
for (int i = 0; i < index && i < str.length(); i++, result++) {
if (i + 1 < str.length() &&
Character.isSurrogatePair(str.charAt(i), str.charAt(i + 1))) {
i++;
}
}
return result;
}
}
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class SurrogatePairTest {
@Test
public void test1() {
String str = "アナと雪の女王";
int len = str.length();
assertEquals(0, SurrogatePair.convertToUTF16Index(str, -1));
assertEquals(0, SurrogatePair.convertFromUTF16Index(str, -1));
for (int i = 0; i <= len; i++) {
assertEquals(i, SurrogatePair.convertToUTF16Index(str, i));
assertEquals(i, SurrogatePair.convertFromUTF16Index(str, i));
}
assertEquals(len, SurrogatePair.convertToUTF16Index(str, len + 1));
assertEquals(len, SurrogatePair.convertFromUTF16Index(str, len + 1));
}
@Test
public void test2() {
String str = "𩸽𩹉と𡢽の👰王";
int len = str.length();
assertEquals(11, len);
assertEquals(0, SurrogatePair.convertToUTF16Index(str, 0));
assertEquals(2, SurrogatePair.convertToUTF16Index(str, 1));
assertEquals(4, SurrogatePair.convertToUTF16Index(str, 2));
assertEquals(5, SurrogatePair.convertToUTF16Index(str, 3));
assertEquals(7, SurrogatePair.convertToUTF16Index(str, 4));
assertEquals(8, SurrogatePair.convertToUTF16Index(str, 5));
assertEquals(10, SurrogatePair.convertToUTF16Index(str, 6));
assertEquals(11, SurrogatePair.convertToUTF16Index(str, 7));
}
@Test
public void test3() {
String str = "𩸽𩹉と𡢽の👰王";
int len = str.length();
assertEquals(11, len);
assertEquals(0, SurrogatePair.convertFromUTF16Index(str, 0));
assertEquals(1, SurrogatePair.convertFromUTF16Index(str, 2));
assertEquals(2, SurrogatePair.convertFromUTF16Index(str, 4));
assertEquals(3, SurrogatePair.convertFromUTF16Index(str, 5));
assertEquals(4, SurrogatePair.convertFromUTF16Index(str, 7));
assertEquals(5, SurrogatePair.convertFromUTF16Index(str, 8));
assertEquals(6, SurrogatePair.convertFromUTF16Index(str, 10));
assertEquals(7, SurrogatePair.convertFromUTF16Index(str, 11));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment