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



>问题

如果有时编码看起来像"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;
}

在这里我被困住了...

相关内容

  • 没有找到相关文章

最新更新