- 主题:请教UTF8和ANSI 转换问题,要抓狂了。
1 windows下源代码默认用utf-16的也见过,这个本质上是ide配置问题,不过vc默认确实是acp的编码,而c#居然不是…
2 也可以编译器选项设置 exec encoding,gcc 和 vc 都行。
3 统一用 wchar_t 取 utf-16 内码是个办法,我觉得在 windows 下面比用 utf-8 内码然后转换省事些。但跨平台不好。
4 源代码加bom就问题不大,太老的管不着。
【 在 hgoldfish 的大作中提到: 】
: 不是这么简单
:
: 1. cpp 源代码在中文平台是默认 GBK 编码的。几种编译器一般不做转化,直接存储到 exe 里面。
: ...................
--
FROM 114.249.193.*
主流编译器就是 utf-16 和 utf-32 两种,和实现有关,但和源代码编码无关。
c++主流实现的 input encoding 和 exec encoding 是解耦的,也都可以通过选项改,编译器内码都是某种 unicode。比方说 msvc,只要带 bom,编译器就自动识别 utf-8 和 utf-16,不带就默认 acp,但对 char[] 字面量就都默认 acp 除非设置 exec enc,而 L 字面量都是 utf-16,u8 当然都是 utf-8,都和源代码编码无关。
【 在 hgoldfish 的大作中提到: 】
: 这个在标准里面并没有说明是存储在 EXE 里面的是 GBK 还是 UTF16,
:
: 跟编译器的实现有关。跟源代码也有关。
: ...................
--
FROM 114.249.193.*
程序字面量可以根据需要用 u8 前缀或者 L 前缀,用资源存储串一般是选 wchar_t,配置文件主要看 io 时编码转换(有些工具库可以帮助),文件 io 显式指定编码,控制台用 wchar_t 保险,gui 看框架一般是 wchar_t 或者某个 utf。
一般大原则是内码避免用非 unicode 编码,具体选 utf-8、utf-16 还是 utf-32 各有利弊。然后 IO 的编码转换就用编码转换的 api(windows 就是前面 z16166 提到的 WideCharToMultiByte,MultiByteToWideChar),别用 locale 搞这个。
【 在 speedboy2998 的大作中提到: 】
: 做转换之前需要调用 setlocale 设置 locale, 我的问题是,对于不同的语言的ANSI字符串,有没有一种万能locale设置可以把他们统统转成UTF8,以及再从UTF8转换成ansi字符串?
: --
: FROM 113.246.192.*
--
修改:milksea FROM 114.249.193.*
FROM 114.249.193.*