- 主题:请教UTF8和ANSI 转换问题,要抓狂了。
不是这么简单
1. cpp 源代码在中文平台是默认 GBK 编码的。几种编译器一般不做转化,直接存储到 exe 里面。
2. cpp11 以后有 u8"", u"" 这样的字符串形式,但是不普及。开源软件很多不用。
3. windows 的 IO 依赖于当前 locale,经常需要程序自己转化。
4. msvc 对 utf-8 的支持在各个版本间变来变去,直到现在还有人在用着 msvc 2008 呢。不容易兼容。
【 在 vonNeumann (劣币驱逐良币 | 少灌水) 的大作中提到: 】
: Windows 上的正确姿势是在程序内部始终使用 WCHAR(就是微软所谓的 "Unicode",实际上特指 UTF-16),只在输入输出时若有必要才进行编码转换
--
FROM 112.47.122.*
这个在标准里面并没有说明是存储在 EXE 里面的是 GBK 还是 UTF16,
跟编译器的实现有关。跟源代码也有关。
【 在 z16166 (Netguy) 的大作中提到: 】
: 中文string literal用L就转为wchar_t了,MSVC支持
: static const WCHAR s[] = L"中文字符串";
--
FROM 112.47.122.*
个人觉得 win msvc 的做法是不对的。c++11 的标准引入 u8, u 这些做法也是自讨苦吃。
我的做法是所有的源代码都要求是 utf-8,直接用 "" 普通字符串表达式,在 windows 底下,要求 msvc 使用 utf-8 编码:
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
https://docs.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8
utf-8 早就是趋势了。异端都应该被吊死。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 主流编译器就是 utf-16 和 utf-32 两种,和实现有关,但和源代码编码无关。
: c++主流实现的 input encoding 和 exec encoding 是解耦的,也都可以通过选项改,编译器内码都是某种 unicode。比方说 msvc,只要带 bom,编译器就自动识别 utf-8 和 utf-16,不带就默认 acp,但对 char[] 字面量就都默认 acp 除非设置 exec enc,而 L 字面量都是 utf-1
--
FROM 110.81.40.*
忍不住笑了。。哈哈哈~~
【 在 vonNeumann (劣币驱逐良币 | 少灌水) 的大作中提到: 】
: 我们之前有些代码积极拥抱新标准,用了 u8"..." 来强调字符串是 UTF-8 编码(其实源代码也是 UTF-8,加个 u8 只是为了强调)
: 结果 C++20 把 u8"..." 的类型从 const char[] 改成 const char8_t[],而且 const char8_t* 还不能隐式转为 const char*,一堆地方要改,一种吃了屎的感觉
: 如果说标准建议凡是 Unicode 字符串都用 char8_t/char16_t/char32_t,想要 deprecate 掉 char/wchar_t,那也行,我都能接受这种阵痛。但尼玛他们又不把支持搞全,std::locale 不支持也就算了,连 C++20 才新增的 std::format 也只有 char/wchar_t 的版本,没有 char8_t/
: ...................
--
FROM 110.81.40.*