Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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字符串的5个字符? 问题_Java_String_Encoding_Formatting_Codepoint - Fatal编程技术网

如何获取任何编码Java字符串的5个字符? 问题

如何获取任何编码Java字符串的5个字符? 问题,java,string,encoding,formatting,codepoint,Java,String,Encoding,Formatting,Codepoint,如果有时编码看起来像“UTF-8”、“UTF-16”和“ASCII”,我怎么能只得到5个字符的字符串呢 注意:有些测试输入有表情符号 代码 例如: 输入:Bärteppich 预期输出:Bärte也表示Bärte 实际输出:BГ·rt 输入:brühe 预期输出:brГјhe也表示brühe 实际输出:brГјh首先,对于所有目的而言,Java字符串始终是UTF-16,尽管由于Java 9,它在内部可能是其他内容 要实现您想要的(“仅从输入字符串中获取前五个字符!”),它应该如下所示: publ

如果有时编码看起来像“UTF-8”、“UTF-16”和“ASCII”,我怎么能只得到5个字符的字符串呢

注意:有些测试输入有表情符号

代码 例如: 输入:
Bärteppich

预期输出:
Bärte
也表示
Bärte

实际输出:
BГ·rt

输入:
brühe

预期输出:
brГјhe
也表示
brühe


实际输出:
brГјh

首先,对于所有目的而言,Java
字符串始终是UTF-16,尽管由于Java 9,它在内部可能是其他内容

要实现您想要的(“仅从输入字符串中获取前五个字符!”),它应该如下所示:

public String truncate( String input ) 
{
    var retValue = (input != null) && (input.length() > 5)
        ? input.substring( 0, 5 )
        : input;

        return retValue;
}
对于这个特定的任务,应该不需要使用代码点

不幸的是,这并不完全正确

它适用于字符串
s=“Dies ist ein langer String”


它不适用于
s=“1234如果字符串有效且包含代码点,则传递到
offsetByCodePoints
的长度应为5而不是6,以便在5个代码点位置的末尾拆分字符串

public String truncate(String input) {
    if (input.codePointCount(0, input.length()) > 5)
    {
        input = input.substring(0, input.offsetByCodePoints(0, 5));
    }

    return input;
}

你为什么故意想要摆脱字符串?
BГ·rte
也不是“意思”“
Bärte
,这意味着您没有正确处理编码。我假设奇数呈现是由于打印而不是损坏的字符串。输入和输出的逐字符打印看起来是否具有预期值?例如,尝试将其添加到
System.out.println(“输入”+Arrays.toString(input.tocharray()))之前和之后的文件中
@DuncG甚至这个问题都暗示他们正在读取不同的编码,但却将其视为相同的编码(可能是平台默认值),这是他们问题的全部根源。@Kayaman看起来可能是的,但仅仅因为字符没有打印到终端并不意味着输入已损坏,这就是我问的原因。例如,可以将日文数据库文本作为字符串读入英国基本机器,并100%安全地写入,但我无法将该文本打印到我机器上的终端,因为它正在写入,因为它在机器上以ASCII默认值显示为乱码文本。@DuncG我知道。我还知道,从我所经历并试图回答的几十个与编码相关的问题中,人们只是不理解编码。他们拒绝接受他们的输入数据被破坏,在读取时代码应该被修复,相反,他们希望黑客代码处理破坏的数据。这只是UTF-16。@Kayaman:你是对的,但就这个问题而言,无论是UTF-16、UTF-8还是ISO-8859-1,它都是透明的——更不用说从一个到另一个的转换也是透明的了。@Kayaman我不同意。String类和所有好的OO类一样,封装了它的状态,因此内部表示是不相关的。就任何程序而言,字符串都是由UTF-16
char
值或32位Unicode码点组成的。@Kayaman啊,我忽略了tquadrat在内部写的是UTF-16,直到你指出了这一点。很公平。@tquadrat您的答案现在更好了,您的truncate()返回的结果与我对输入的回答相同
s=“1234\uD83C\uDDE6\uD83C\uDDE8”
,两者都将truncate(s)`as“1234\uD83C\uDDE6”,这是一个长度为6的字符串,只有一对。字符串
codePointCount()
似乎只用于char+subrogate的2字符定义,而不像此标志那样使用4个字符。在我的时代,字节就是字符!有关
String.offsetByCodePoints()
的说明,请参阅
String.length()
对字符串中的字符进行计数,
String.substring()
返回字符–这是函数的要求。不需要在这里玩代码点!我承认我从来没有用过表情符号!但我的理解是,它包含一些:
String s=“1234\uD83C\uDDE6\uD83C\uDDE8”
s.offsetByCodePoints(0,5)
返回6,因此如果该字符串在第5个代码点处被截断,则调用是
s.substring(0,input.offsetByCodePoints(0,5))
,该字符串的长度为6个字符。现在我有更多的理由去避免它们。
public String truncate(String input) {
    if (input.codePointCount(0, input.length()) > 5)
    {
        input = input.substring(0, input.offsetByCodePoints(0, 5));
    }

    return input;
}