setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
setw() imbues wrong output on strings containing UTF-8 multi-byte characters/code points
我需要输出一些可能是 UTF-8 多字节的数据,我需要使用 setw()
保持它们的格式。
当字符是多字节序列时,标识将丢失,并且setw()
无法正常工作。
//#include <stdio.h>
#include <locale>
#include <iostream>
//#include <fstream>
#include <iomanip>
//#include <sstream>
int main(int argc, char **argv)
{
std::locale l=std::locale("en_US.utf8");
std::locale::global(l);
std::cout.imbue(l);
std::cout<<std::endl;
std::cout<<std::setw(40)<<std::right<<"hi “my” friend"<<std::endl;
std::cout<<std::setw(40)<<std::right<<"hi -my- friend"<<std::endl;
return 0;
}
输出为:
hi “my” friend
hi -my- friend
我错过了什么?
我必须指出,字符 “
和 ”
不是正常的"
而是另外两个,在 UTF-8 中,每个字符由三个字节表示。
字符串
文字"hi -my- friend"
包含 14 个字符。字符串文本"hi “my” friend"
包含 18 个字符:符号“
和”
由 3 个字符/字节编码。 cout
按原样输出这些字符,它是将 3 字节序列转换为单个符号的目标终端。
因此,从流的角度来看,一切都很好:它输出(width - strlen(literal) )
填充字符,然后strlen(literal)
字符,width
总计。它不处理可能的多字节序列,也不知道目标终端将多个字符转换为一个符号。
您可以通过计算字符串在宽表示形式中将有多少个字符来完成此格式设置,然后取字符串长度与宽表示之间的差值,然后将该差值添加到传递给setw
的内容中,例如:
std::mbstate_t state = std::mbstate_t();
std::string s = "hi “my” friend";
const char *cp = s.c_str();
size_t len = mbsrtowcs(nullptr, &cp, s.size(), &state);
std::cout << setw(40 + (s.size() - len)) << std::right << s << std::endl;
您可以将此功能编码为一个函数,该函数将字符串作为参数,并仅返回要添加到 setw 调用中的差值:
size_t f(const std::string &s)
{
std::mbstate_t state = std::mbstate_t();
const char *cp = s.c_str();
size_t len = mbsrtowcs(nullptr, &cp, s.size(), &state);
return s.size() - len;
}
...
std::string s = "hi “my” friend";
std::cout << std::setw(40 + f(s)) << std::right << s << std::endl;
相关文章:
- 如何使用堆栈将字符串输入拉伸 k 次
- 不确定出了什么问题(字符串输入)
- 如何获取字符串输入n次?
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- C++ 对象数组字符串输入在控制台上不起作用
- 为什么 cin 在包含字符串标头后接受字符串输入
- 拆分字符串输入并查找字符是否有效
- 有没有办法将最初作为字符串输入的数字字符数组复制到双向链表中
- 将字符串输入到多维数组中
- 字符串输入后的空格
- 字符串流中的自定义字符串输入
- C 未验证字符串输入
- 总结数字字符串输入的最佳方法
- 如何验证用户将字符串输入到std :: cin中
- 在C++测试家庭作业问题中的字符串输入时无法退出循环(作为数据验证)
- 如何在C++中检测字符串输入中的换行符
- C++将字符串输入拆分为两个整数
- 如何检查字符串输入是否为有效的双精度
- 在读取数据文件时,如何找到用户字符串输入的字谜?