Last active
March 15, 2016 07:04
-
-
Save hoshi-takanori/07bc363208ea0ba1382e to your computer and use it in GitHub Desktop.
Surrogate pair index conversion in Java.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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