Rust 解决生锈字符串格式化程序忽略某些unicode字符串的正确字符串长度的问题
我用的是println!使用以下命令排列列:Rust 解决生锈字符串格式化程序忽略某些unicode字符串的正确字符串长度的问题,rust,Rust,我用的是println!使用以下命令排列列: fn main(){ 让name_col_w=24; 设col_w=9; println!(“{:从技术上讲,这里没有不正确的字符串长度 问题是,大多数单空间字体根本不处理CJK,要么不支持它(因此退回到另一个前端,这很可能是真的),要么就CJK而言没有单间距:单空间字体的整个要点是 [所有]字母和字符占据相同的水平空间 但这里显然不是这样,因为您自己的对齐方式清楚地显示了麒麟占用超过3个ascii字符的水平空间: "麒麟", &
fn main(){
让name_col_w=24;
设col_w=9;
println!(“{:从技术上讲,这里没有不正确的字符串长度
问题是,大多数单空间字体根本不处理CJK,要么不支持它(因此退回到另一个前端,这很可能是真的),要么就CJK而言没有单间距:单空间字体的整个要点是
[所有]字母和字符占据相同的水平空间
但这里显然不是这样,因为您自己的对齐方式清楚地显示了麒麟代码>占用超过3个ascii字符的水平空间:
"麒麟",
"OOO",
因此,虽然麒麟24
是4个字符[0],它占用的可视空间略多于5个,因此填充到24[0]会导致对齐错误
我不认为除了使用足够完整的monospace字体在您期望的整个字符范围内使用monospace字体,或者使用GUI工具包(不会受到此问题的影响)之外,还有任何解决方案。我不确定即使是TUIs/raw终端输出也能处理此问题
事实上,这甚至可能是GUI中的一个问题,因为如果您真的想让一切都恰到好处,您需要遍历整个渲染管道,然后测量实际的“位图”大小(实际显示在屏幕上的大小)
在POSIX 2001中,wcwidth(3)
和wcswidth(3)
应该有助于查询终端,以了解字符或字符串的宽度,这可能有效,也可能无效,这取决于终端,并且仅在实际终端中有效(例如,在我的实际终端中,麒麟 只需要4个单元格,这显然不是fontset使用的情况)
[0]您可能会遇到的另一个问题是count
以及在码点方面的字符串填充工作,这已经是非常不正确的,例如,由于组合码点,即使仅使用美式英语中可能遇到的形式,这也很容易证明:
println!("[{:<4}]", "é");
println!("[{:<4}]", "e\u{0301}");
因为第二行使用两个代码点来表示单个石墨烯簇,这就放弃了简单的对齐计算(除了前两个代码点转换为单个石墨烯簇外,它添加了两个空间代码点以达到4,因此我们以3个石墨烯簇结束,而不是我们预期的4个)从技术上讲,这里没有不正确的字符串长度
问题是,大多数单空间字体根本不处理CJK,要么不支持它(因此退回到另一个前端,这很可能是真的),要么就CJK而言没有单间距:单空间字体的整个要点是
[所有]字母和字符占据相同的水平空间
但这里显然不是这样,因为您自己的对齐方式清楚地显示了麒麟代码>占用超过3个ascii字符的水平空间:
"麒麟",
"OOO",
因此,虽然麒麟24
是4个字符[0],它占用的可视空间略多于5个,因此填充到24[0]会导致对齐错误
我不认为除了使用足够完整的monospace字体在您期望的整个字符范围内使用monospace字体,或者使用GUI工具包(不会受到此问题的影响)之外,还有任何解决方案。我不确定即使是TUIs/raw终端输出也能处理此问题
事实上,这甚至可能是GUI中的一个问题,因为如果您真的想让一切都恰到好处,您需要遍历整个渲染管道,然后测量实际的“位图”大小(实际显示在屏幕上的大小)
在POSIX 2001中,wcwidth(3)
和wcswidth(3)
应该有助于查询终端,以了解字符或字符串的宽度,这可能有效,也可能无效,这取决于终端,并且仅在实际终端中有效(例如,在我的实际终端中,麒麟 只需要4个单元格,这显然不是fontset使用的情况)
[0]您可能会遇到的另一个问题是count
以及在码点方面的字符串填充工作,这已经是非常不正确的,例如,由于组合码点,即使仅使用美式英语中可能遇到的形式,这也很容易证明:
println!("[{:<4}]", "é");
println!("[{:<4}]", "e\u{0301}");
因为第二行使用两个代码点来表示单个石墨烯簇,这就放弃了简单的对齐计算(除了前两个代码点转换为单个石墨烯簇外,它添加了两个空间代码点以达到4,因此我们以3个石墨烯簇结束,而不是我们预期的4个)感谢您的详细解释。我想我提出的核心问题是将字符宽度与字符数混为一谈,正如您所指出的,如果单间隔字体不包含所有可能的unicode字符,这是行不通的。在我的情况下,我不确定在所有情况下使用println!将问题排列起来的解决方案是什么!听起来像不可能在所有情况下使用此方法)。谢谢!谢谢你的详细解释。我想我提出的核心问题是将字符宽度与字符数混为一谈,正如你所指出的,如果单间隔字体不包括所有可能的unicode字符,这是行不通的。在我的情况下,我不确定在所有情况下使用println!声音排列的解决方案是什么我想这在所有情况下都是不可能的。谢谢!