Yok Unicode Basic Multiligual Plane dışında karakterleri kodlamak için kullanılan vekil çiftleri için çalışır.
İşte bir dize (KDV. Kullanarak Java 8 akışı API) "karakterlerini" üzerinde yineleme için üç farklı teknikler kullanılarak bir örnektir. Lütfen bu örnekte Unicode Ek Çok Dilli Düzlem (SMP) karakterlerini içerdiğini unutmayın. Bu örneği ve sonucu doğru şekilde görüntülemek için uygun bir yazı tipine ihtiyacınız var. karakter
ilk çözüm ait
// String containing characters of the Unicode
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown jumps over the lazy ";
Bıkmadan dizesinin tüm char
üzerinde basit bir döngü: Kod noktalarının
/* 1 */
System.out.println(
"\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
char c = str.charAt(pos);
System.out.printf("%s ", Character.toString(c));
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
}
yineleme
ikinci çözüm açık bir döngü kullanır Ayrıca, kod noktalarına codePointAt ile erişme ve döngü dizinini 012'ye göre arttırma: Java 8 Stream API üçüncü çözelti esas olarak ikinci aynı olan Akış API
kullanılarak, fakat kod noktaları üzerinde
/* 2 */
System.out.println(
"\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
int cp = str.codePointAt(pos);
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
pos += Character.charCount(cp);
// ^^^^^^^^^^^^^^^^^^^^^^^
// Increment pos by 1 of more depending
// the number of Java `char` required to
// encode that particular codepoint.
}
yineleme:
/* 3 */
System.out.println(
"\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
cp -> {
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
});
Sonuçlar
Bu test programını çalıştırırsanız aşağıdakileri elde edersiniz:
(Düzgün hiyeroglif görüntülemek yapabileceklerse) Gördüğünüz gibi
, ilk çözüm Unicode BMP dışında düzgün karakterleri işlemez. Diğer taraftan, diğer iki çözüm, vekil çiftlerle iyi anlaşır.
Bu çok garip bir sorudur. – user845279
Bu nedir? Cevap oldukça basittir. – ametren
Bir "char" değeri istemediğini fark ettiniz mi? Ve substring() 'nin nasıl yapılacağını bilir, ancak sadece" neat "bir yöntem ister. Bilginize şunu söyleyebilirim: 'substring()' en düzgün yoldur. – user845279