>问题
如果有时编码看起来像"UTF-8"、"UTF-16"和"ASCII",我怎么能只得到 5 个字符的字符串?
注意:某些测试输入具有表情符号。
法典
public String truncate(String input) {
if (input.codePointCount(0, input.length()) > 5)
{
return input.substring(0, input.offsetByCodePoints(0, 5));
}
return input;
}
例如:
输入:Bärteppich
预期输出:BГ¤rte
也意味着Bärte
实际输出:BГ¤rt
输入:brühe
预期输出:brГјhe
也意味着brühe
实际输出:brГјh
首先,出于所有目的,JavaString
始终是 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🇦🇨😉5678";
.
不幸的是,String.offsetByCodePoints()
在这里没有帮助;当使用问题的原始代码时,如下所示:
public String truncate( String input )
{
int x = 5;
if( input.codePointCount( 0, input.length() ) > 5 )
{
return input.substring( 0, input.offsetByCodePoints( 0, x ) );
}
return input;
}
x
的正确值取决于字符串的内容。
这是因为🇦🇨两个代码点计数,而😉只是一个 - 并且两者都不止一个char
。
所以这个也失败了:
public String truncate( String input )
{
var retValue = input;
if( input.codePointCount( 0, input.length() ) > 5 )
{
int [] codepoints = input.codePoints().limit( 5 ).toArray();
retValue = new String( codepoints, 0, 5 );
}
return retValue;
}
在这里我被困住了...