setw 和重音字符
setw and accentuated characters
我想在 C++ 上显示“漂亮”的国家列表及其 ISO 货币代码。
问题是我的数据是法语的,并且有重音字符。这意味着阿尔及利亚实际上写成“Algérie”而瑞典变成“Suède”。
map<string, string> currencies; /* ISO code for currency and country name: CAD/Canada */
for (auto &cursor: countries)
cout << setw(15) << left << cursor.second << right << " - " cursor.first << endl;
如果地图包含阿尔及利亚、加拿大和瑞典,结果将如下所示:
Canada - CAD
Algérie - DZD
Suède - SEK
你看阿尔及利亚和瑞典有多不“漂亮”吗?这是因为即使“Algérie”有 7 个可见字符而“Suède”有 5 个,对于 setw,它们“算”为一个。 “Algérie”中的“é”和“Suède”中的“蔓算”为两个字符,因为它们是“特殊重音字符。
是否有优雅和简单的方法来确保 DZD 和 SEK 自动与 CAD 保持一致?
- 转换为使用
std::wstring
而不是 std::string
- 转换为使用宽字符串常量(
L"stuff"
与 "stuff"
)
- 转换为使用
std::wcout
而不是 std::cout
- 使用
setlocale
设置 UTF-8 语言环境
- 使用
wcout.imbue
为 UTF-8 语言环境配置 wcout
示例:
#include <map>
#include <string>
#include <iostream>
#include <iomanip>
#include <locale>
int main() {
setlocale(LC_ALL, "en_US.utf8");
std::locale loc("en_US.UTF-8");
std::wcout.imbue(loc);
std::map<std::wstring, std::wstring> dict
{ {L"Canada",L"CAD"}, {L"Algérie",L"DZD"}, {L"Suède",L"SEK"} };
for (const auto& [key, value]: dict) {
std::wcout << std::setw(10) << key << L" = " << value << std::endl;
}
}
我想在 C++ 上显示“漂亮”的国家列表及其 ISO 货币代码。 问题是我的数据是法语的,并且有重音字符。这意味着阿尔及利亚实际上写成“Algérie”而瑞典变成“Suède”。
map<string, string> currencies; /* ISO code for currency and country name: CAD/Canada */
for (auto &cursor: countries)
cout << setw(15) << left << cursor.second << right << " - " cursor.first << endl;
如果地图包含阿尔及利亚、加拿大和瑞典,结果将如下所示:
Canada - CAD
Algérie - DZD
Suède - SEK
你看阿尔及利亚和瑞典有多不“漂亮”吗?这是因为即使“Algérie”有 7 个可见字符而“Suède”有 5 个,对于 setw,它们“算”为一个。 “Algérie”中的“é”和“Suède”中的“蔓算”为两个字符,因为它们是“特殊重音字符。
是否有优雅和简单的方法来确保 DZD 和 SEK 自动与 CAD 保持一致?
- 转换为使用
std::wstring
而不是std::string
- 转换为使用宽字符串常量(
L"stuff"
与"stuff"
) - 转换为使用
std::wcout
而不是std::cout
- 使用
setlocale
设置 UTF-8 语言环境 - 使用
wcout.imbue
为 UTF-8 语言环境配置 wcout
示例:
#include <map>
#include <string>
#include <iostream>
#include <iomanip>
#include <locale>
int main() {
setlocale(LC_ALL, "en_US.utf8");
std::locale loc("en_US.UTF-8");
std::wcout.imbue(loc);
std::map<std::wstring, std::wstring> dict
{ {L"Canada",L"CAD"}, {L"Algérie",L"DZD"}, {L"Suède",L"SEK"} };
for (const auto& [key, value]: dict) {
std::wcout << std::setw(10) << key << L" = " << value << std::endl;
}
}