在Java中格式化字符串的长度(以字节为单位)

在Java中格式化字符串的长度(以字节为单位),java,formatter,Java,Formatter,假设我在Java中有一个包含非ASCII字符的字符串,我想使用String.format()来设置它,这样格式化的字符串将具有字符串字节长度的最小宽度 String s = "æøå"; String.format(l, "%" + 10 + "s" , s); 这将产生一个带7个前导空格的字符串 但是我想要的是,应该只有4个前导空格,因为原始字符串的大小是6字节 这似乎是一个常见的要求,所以我想问是否有任何已经构建的类可以实现这一点,或者我应该自己实现Formattable接口吗?一个字符串

假设我在Java中有一个包含非ASCII字符的字符串,我想使用
String.format()
来设置它,这样格式化的字符串将具有字符串字节长度的最小宽度

String s = "æøå";
String.format(l, "%" + 10 + "s" , s);
这将产生一个带7个前导空格的字符串

但是我想要的是,应该只有4个前导空格,因为原始字符串的大小是6字节


这似乎是一个常见的要求,所以我想问是否有任何已经构建的类可以实现这一点,或者我应该自己实现
Formattable
接口吗?

一个字符串没有多少字节,它有很多字符。表示字符串所需的字节数取决于您使用的编码。在填充方面,我不知道有什么内置的东西可以做你们想做的事情(我不认为这是一个常见的要求)。您可以询问a每个字符的最大和平均字节数,但我看不到任何方法可以在不进行编码的情况下获得特定字符串的字节数:

Charset cs = Charset.forName("UTF-8");
ByteBuffer buffer = cs.encode("foobar");
int lengthInBytes = buffer.remaining();

如果要对字符串进行编码,可能只需要执行编码,计算出需要多少填充,然后写出编码的填充,然后写出已经编码的文本。这实际上取决于您对数据所做的操作。

很抱歉,我忘了提到我正在将UTF8格式的字符串导出到一个文件中,某种代理会根据文件大小的大小来操作该文件。这就是为什么会出现这个问题。@Quincy:但是填充通常是为了在文本中提供适当的对齐方式-如果您只是为了防止文件变得太大而填充,那么您确定需要填充吗?这似乎是一个非常不寻常的要求。可悲的是,客户机需要一行串联的字段,由他们自己的工具拆分和读取。因此,我们需要确定行中每个
字段的长度,否则他们无法正确解析输入…:/@Quincy:好的,听起来你可能确实想要这个-但我希望你现在理解为什么你认为这是“常见要求”可能是不正确的:)谢谢,这有点有效,但不是我所要求的。我希望有人确认我是否有我提到的现有功能。:)@Quincy在什么意义上,String.format()不是一个“现有函数”?
String s ="æøå";
int size = s.getBytes("UTF8").length;
String.format("%" + (10 - size) + "s" , s);