您正在寻找的方法是charAt。这是一个例子:String text = "foo";char charAtZero = text.charAt(0);System.out.println(charAtZero); // Prints f有关更多信息,请参见上的Java文档String.charAt。如果想要另一个简单的教程,这一个或这一个。如果您不希望将结果作为char数据类型,而是作为字符串,则可以使用以下Character.toString方法:String text = "foo";String letter = Character.toString(text.charAt(0));System.out.println(letter); // Prints f如果您想要有关Character类和toString方法的更多信息,我从Character.toString的文档中提取了我的信息。
对于Unicode基本多义平面以外的字符编码的代理对,提出的答案均不适用。这是一个使用三种不同技术来迭代字符串的“字符”(包括使用Java 8流API)的示例。请注意,此示例包含Unicode补充多语言平面(SMP)的字符。您需要适当的字体才能正确显示此示例和结果。// String containing characters of the Unicode // Supplementary Multilingual Plane (SMP)// In that particular case, hieroglyphs.String str = "The quick brown ? jumps over the lazy ????";重复字符第一个解决方案是遍历所有char字符串的简单循环:/* 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}迭代代码点第二种解决方案也使用显式循环,但是使用codePointAt访问各个代码点,并根据charCount相应地增加循环索引:/* 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.}使用Stream API遍历代码点第三种解决方案与第二种基本相同,但是使用的是Java 8 Stream API:/* 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 });结果运行该测试程序时,您将获得:Using char iterator (do not work for surrogate pairs !)T h e q u i c k b r o w n ? ? j u m p s o v e r t h e l a z y ? ? ? ? ? ? ? ? Using Java 1.5 codePointAt(works as expected)T h e q u i c k b r o w n ? j u m p s o v e r t h e l a z y ? ? ? ? Using Java 8 stream (works as expected)T h e q u i c k b r o w n ? j u m p s o v e r t h e l a z y ? ? ? ? 如您所见(如果您能够正确显示象形文字),第一个解决方案将无法正确处理Unicode BMP之外的字符。另一方面,其他两个解决方案可以很好地处理代理对。