有没有 Native 大佬求教

2023-10-17 17:49:18 +08:00
 sanyang001

项目要搞原生 C++开发,涉及到多语言,发现 string 转 wstring 方法太难了,求有经验的大佬指点。

  1. wcstombs 、mbstowcs 方法转出的字符有问题。

  2. wstring_convert 只适用于 C++11 、C++14 ,低端机崩溃哇哇的。

  3. MultiByteToWideChar 只适用于 windows 。

  4. string copy 方法不适合多语言。

太难了

8081 次点击
所在节点    Android
9 条回复
feng32
2023-10-17 18:38:15 +08:00
路径大致有 2 条吧

1. 使用宏区分不同平台,调用各自的原生方法
2. 使用跨平台的 C++ 框架 (比如 Qt)
liberize
2023-10-17 19:07:52 +08:00
wcstombs 、mbstowcs 搭配 setlocale 使用。
ysc3839
2023-10-17 19:17:27 +08:00
一般情况下 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 啥的有关,坑多。
ysc3839
2023-10-17 19:17:52 +08:00
另外建议说一下具体情况,为什么要用到 wchar_t ?
asuraa
2023-10-18 00:06:35 +08:00
string 本身是没编码的 区别在于你咋用 你用来存 utf8 就是 utf8 你用来存多字节就是多字节 甚至可以存 Unicode
tairan2006
2023-10-18 08:53:08 +08:00
用 QString
sanyang001
2023-10-18 10:34:00 +08:00
@ysc3839 多语言,有个查找算法,需要遍历查找每个字符匹配查询。
ysc3839
2023-10-18 11:19:37 +08:00
@sanyang001 那转成 UTF-32 进行遍历吧。如果不是频繁匹配的话,有流式的 UTF-8 转 UTF-32 方案,可以读一个字符解析一下,不需要拷贝多一份 UTF-32 的字符串。如果频繁匹配且不介意内存占用的话,可以转换成 UTF-32 存起来。
sanyang001
2023-10-18 14:19:40 +08:00
@ysc3839 多谢建议

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX