Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取字符串的第一个符号_Java_Android_String_Unicode - Fatal编程技术网

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拆分
字符串时,您将得到一个字符串数组,您可以逐个迭代这些字符串以获得所有表情符号。我已经实现了它,但由于出现了太多的角案例,因此效果不太好。请看更新的问题。