使用 c++(不带 winapi)将 UTF-8 字符转换为最接近的等效 ASCII 字符
Convert UTF-8 characters to nearest equivalent ASCII characters using c++ (without winapi)
有没有人有一个代码片段,可以转换至少欧洲语言最常见的字符?例如:
Testáén
作为 UTF-8 编码字符串(即十六进制字节:74 65 73 74 c3 a1 c3 a9 6e 0(
自
泰斯塔恩
(我想使用 c/c++ 和 std,或者小型跨平台库(
下面是处理将字符从 ISO-8859-1 范围转换为 ascii 的代码。替换字符用于 ascii 以外的所有其他字符。
#include <codecvt>
#include <array>
#include <string>
#include <iostream>
constexpr char const *rc = "?"; // replacement_char
// table mapping ISO-8859-1 characters to similar ASCII characters
std::array<char const *,96> conversions = {{
" ", "!","c","L", rc,"Y", "|","S", rc,"C","a","<<", rc, "-", "R", "-",
rc,"+/-","2","3","'","u", "P",".",",","1","o",">>","1/4","1/2","3/4", "?",
"A", "A","A","A","A","A","AE","C","E","E","E", "E", "I", "I", "I", "I",
"D", "N","O","O","O","O", "O","*","0","U","U", "U", "U", "Y", "P","ss",
"a", "a","a","a","a","a","ae","c","e","e","e", "e", "i", "i", "i", "i",
"d", "n","o","o","o","o", "o","/","0","u","u", "u", "u", "y", "p", "y"
}};
template <class Facet>
class usable_facet : public Facet {
public:
using Facet::Facet;
~usable_facet() {}
};
std::string to_ascii(std::string const &utf8) {
std::wstring_convert<usable_facet<std::codecvt<char32_t,char,std::mbstate_t>>,
char32_t> convert;
std::u32string utf32 = convert.from_bytes(utf8);
std::string ascii;
for (char32_t c : utf32) {
if (c<=U'u007F')
ascii.push_back(static_cast<char>(c));
else if (U'u00A0'<=c && c<=U'u00FF')
ascii.append(conversions[c - U'u00A0']);
else
ascii.append(rc);
}
return ascii;
}
int main() {
std::cout << to_ascii(u8"testáénn");
}
您需要处理大量的 Unicode 字符。所以"小"的标准是一个不可能的标准。ICU 库包含您需要的内容,但因此您不会发现它很小。例如,您需要处理组合和非组合修饰符。
如果您真的只关心可能的 Unicode 字符的一小部分,那么您可以创建自己的简单映射表。
我想使用 c/c++ 和 std,或者小型跨平台库
不幸的是,我不确定是否存在符合您所有标准的库。
您可能会找到的最小的东西是iconv,其UTF-8到ASCII转换器可能无法完全满足您的需求。
我很确定ICU可以做你想做的事,虽然ICU是跨平台的,但从来没有人指责它很小。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错