Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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/8/http/4.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
Rust 解决生锈字符串格式化程序忽略某些unicode字符串的正确字符串长度的问题_Rust - Fatal编程技术网

Rust 解决生锈字符串格式化程序忽略某些unicode字符串的正确字符串长度的问题

Rust 解决生锈字符串格式化程序忽略某些unicode字符串的正确字符串长度的问题,rust,Rust,我用的是println!使用以下命令排列列: fn main(){ 让name_col_w=24; 设col_w=9; println!(“{:从技术上讲,这里没有不正确的字符串长度 问题是,大多数单空间字体根本不处理CJK,要么不支持它(因此退回到另一个前端,这很可能是真的),要么就CJK而言没有单间距:单空间字体的整个要点是 [所有]字母和字符占据相同的水平空间 但这里显然不是这样,因为您自己的对齐方式清楚地显示了麒麟占用超过3个ascii字符的水平空间: "麒麟", &

我用的是println!使用以下命令排列列:

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!声音排列的解决方案是什么我想这在所有情况下都是不可能的。谢谢!