项目要搞原生 C++开发,涉及到多语言,发现 string 转 wstring 方法太难了,求有经验的大佬指点。
wcstombs 、mbstowcs 方法转出的字符有问题。
wstring_convert 只适用于 C++11 、C++14 ,低端机崩溃哇哇的。
MultiByteToWideChar 只适用于 windows 。
string copy 方法不适合多语言。
太难了
1
feng32 2023-10-17 18:38:15 +08:00
路径大致有 2 条吧
1. 使用宏区分不同平台,调用各自的原生方法 2. 使用跨平台的 C++ 框架 (比如 Qt) |
2
liberize 2023-10-17 19:07:52 +08:00 via Android
wcstombs 、mbstowcs 搭配 setlocale 使用。
|
3
ysc3839 2023-10-17 19:17:27 +08:00 via Android
一般情况下 C/C++ 不需要用到 wchar_t 吧?大多数平台上 wchar_t 是 4 字节的 UTF-32 ,很浪费空间,除非是要遍历字符。wchar_t 一般是 Windows 才用,是 2 字节的 UTF-16 。
大多数情况下是直接用 char 存 UTF-8 ,一定要用 wchar_t 的话,找个 UTF-8 转 UTF-32 的代码即可,Windows 下可以找个 UTF-8 转 UTF-16 的,或者直接用 MultiByteToWideChar 。 别用 wcstombs ,印象中跟 locale 啥的有关,坑多。 |
4
ysc3839 2023-10-17 19:17:52 +08:00 via Android
另外建议说一下具体情况,为什么要用到 wchar_t ?
|
5
asuraa 2023-10-18 00:06:35 +08:00
string 本身是没编码的 区别在于你咋用 你用来存 utf8 就是 utf8 你用来存多字节就是多字节 甚至可以存 Unicode
|
6
tairan2006 2023-10-18 08:53:08 +08:00
用 QString
|
7
sanyang001 OP @ysc3839 多语言,有个查找算法,需要遍历查找每个字符匹配查询。
|
8
ysc3839 2023-10-18 11:19:37 +08:00 via Android
@sanyang001 那转成 UTF-32 进行遍历吧。如果不是频繁匹配的话,有流式的 UTF-8 转 UTF-32 方案,可以读一个字符解析一下,不需要拷贝多一份 UTF-32 的字符串。如果频繁匹配且不介意内存占用的话,可以转换成 UTF-32 存起来。
|
9
sanyang001 OP @ysc3839 多谢建议
|