Java 如何获取字符串的第一个符号
我需要显示字符串的第一个符号。最简单的代码是:Java 如何获取字符串的第一个符号,java,android,string,unicode,Java,Android,String,Unicode,我需要显示字符串的第一个符号。最简单的代码是: String text = "test string"; char firstSymbol = text[0]; 但是,如果字符不适合16位,则这不起作用,例如“\uD83D\uDC68”(我注意到您使用(\u200D)字符连接表情符号,您可以通过此字符连接字符串: String[] result = text.split("\u200D"); 并以下一种方式获取第一个字符: String firstSymbol = result[0]; \
String text = "test string";
char firstSymbol = text[0];
但是,如果字符不适合16位,则这不起作用,例如
“\uD83D\uDC68”
(我注意到您使用(\u200D)
字符连接表情符号,您可以通过此字符连接字符串
:
String[] result = text.split("\u200D");
并以下一种方式获取第一个字符:
String firstSymbol = result[0];
\u200D
是Unicode码点U+200D零宽度连接符
。如果要提取连接的码点序列,必须手动迭代字符串,直到遇到未连接的码点,例如:
String text = ...;
StringBuilder sequence = new StringBuilder(text.length());
boolean isInJoin = false;
int codePoint;
for (int i = 0; i < text.length(); i = text.offsetByCodePoints(i, 1))
{
codePoint = text.codePointAt(i);
if (codePoint == 0x200D)
{
isInJoin = true;
if (sequence.length() == 0)
continue;
}
else
{
if ((sequence.length() > 0) && (!isInJoin)) break;
isInJoin = false;
}
sequence.appendCodePoint(codePoint);
}
if (isInJoin)
{
for(int i = sequence.length()-1; i >= 0; --i)
{
if (sequence.charAt(i) == 0x200D)
sequence.deleteCharAt(i);
else
break;
}
}
String firstSymbols = sequence.toString();
字符串文本=。。。;
StringBuilder序列=新的StringBuilder(text.length());
布尔值isInJoin=false;
int码点;
对于(int i=0;i0)和(!isInJoin))中断;
isInJoin=假;
}
追加码点(codePoint);
}
如果(isInJoin)
{
对于(int i=sequence.length()-1;i>=0;--i)
{
if(序列字符(i)=0x200D)
序列。删除字符(i);
其他的
打破
}
}
字符串firstSymbols=sequence.toString();
或者:
String text = ...;
boolean isInJoin = false;
int start = 0, length = 0, next;
int codePoint;
for (int i = 0; i < text.length(); i = next)
{
codePoint = text.codePointAt(i);
if (codePoint == 0x200D)
{
isInJoin = true;
if (length == 0)
{
next = text.offsetByCodePoints(i, 1);
start = next;
continue;
}
}
else
{
if ((length > 0) && (!isInJoin)) break;
isInJoin = false;
}
next = text.offsetByCodePoints(i, 1);
length += (next - i);
}
if (isInJoin)
{
for(int i = length-1; i >= 0; --i)
{
if (text.charAt(i) == 0x200D)
--length;
else
break;
}
}
String firstSymbols = text.substring(start, start+length);
字符串文本=。。。;
布尔值isInJoin=false;
int start=0,length=0,next;
int码点;
for(int i=0;i0)和(!isInJoin))断裂;
isInJoin=假;
}
next=text.offsetByCodePoints(i,1);
长度+=(下一个-i);
}
如果(isInJoin)
{
对于(int i=length-1;i>=0;--i)
{
if(text.charAt(i)=0x200D)
--长度;
其他的
打破
}
}
字符串firstSymbols=text.substring(开始,开始+长度);
“但如果字符不适合16位,则此操作不起作用”->,因为语法(char firstSymobl=text[0];
)错误。我认为您的意思是使用text.charAt(0)
(这不会解决“超过16位”的问题)您可以使用text.substring(0,1)它将为您提供字符串的第一个字符。但在此之前,请检查字符串是否为空。@幸运的是,它将返回大小为1的字符串,而不是字符:)从字符串中获取字符的方法是字符(int index)
修复了它,请查看更新的问题。我还假设字符串不是空的,也不是空的,因为提到零宽度joiner,我将尝试了解更多。然而,我需要获得两个被连接的表情符号,以便正确显示结果。我将尝试迭代该字符串并连接表情符号(如果它们由零宽度joiner分隔)。当您通过零宽度joiner拆分字符串时,您将得到一个字符串数组,您可以逐个迭代这些字符串以获得所有表情符号。我已经实现了它,但由于出现了太多的角案例,因此效果不太好。请看更新的问题。