关于windows系统里locale、code page、ANSI编码的问题

最近把公司代码库里的代码同步下来之后编译了下,竟然出问题。问下同事说代码库肯定没问题,而我啥也没改,那到底那里出问题了呢?

VS2018报的错误是:error RC2001: newline in constant

百度下这个错误的原因,主要原因是定义的字符串常量两个引号之间有换行,跳到相应出错的代码位置处,大体可以解决这个编译错误。当然,这个问题只是表象。由于代码库里的代码编译肯定能通过,而且这些代码已经跑了很久了,不可能存在这么低级的编译问题。

那么问题出在哪呢?

答案是操作系统的设置。问题源自于windows本身的一个历史包袱吧,我大体简述下,自己对这个问题本身研究也不透彻,所以有问题请谅解:大体就是windows在支持国际化的道路上是推荐使用unicode的,毕竟一个编码标准就能支持这个世界上所有语言的所有文字,也就不存在乱码之类的问题了。但是windows也是半路才支持unicode的,在这之前一直是使用locale+ANSI编码标准的。这个是个什么玩意儿呢?大体就是可以通过控制面板里的一个选项来设置系统的locale,而系统会根据你的locale来选择在ANSI编码(严格说这个不能叫编码!!)模式下(相对于unicode而言,也就是文本编辑器如notepad++、VS的编辑器等检测到当前的文本文件的编码不是unicode)所使用的编码。比如如果locale是Chinese PRC,则此时ANSI编码为gb2312(或者gbk,反正是gb系的),而如果locale是English US的话,则ANSI编码对应扩展的ascii(貌似,没有求证)。说实话ANSI这个叫法着实蛋疼,很让人费解,因为ANSI本身是个标准委员会,不明就里的人根本不知道是说啥么。

回到刚刚的编译问题,由于这些代码通常实在locale为English US的情况下编译的,而代码文件本身不是unicode编码,所以就应该是使用扩展ascii来进行编码/解码。但由于我的locale是Chinese PRC,所以对于非unicode编码的文件系统是使用gb2312来解析的。嗯嗯,问题来了,文件的编码和解码所使用的标准不兼容,导致各种诡异问题。

这里想吐槽下微软在处理这种问题下遗留下的种种尾巴,不过咋说呢,问题本身太复杂,解决不好也不怪这样臃肿的大公司,谁还没有点顽疾呢。

关于编码的问题知乎上有讨论:

http://www.zhihu.com/question/20650946

可以参考下,可能讲的比我清楚。

另外,关于locale对应的ANSI编码,微软是叫code page的。locale与code page的对应可以参见:

http://www.science.co.il/language/Locale-Codes.asp?s=codepage

http://blog.csdn.net/whygosofar/article/details/4344252

没时间了解太多,有问题请谅解。

时间: 2024-08-27 18:28:02

关于windows系统里locale、code page、ANSI编码的问题的相关文章

VMware(一):Windows系统给虚拟机系统共享文件、虚拟机里Linux系统挂载共享文件镜像做yum源

一.Windows系统给虚拟机系统共享文件 目标: 环境:PC机为Windows系统,安装了虚拟机VMware12版本,在虚拟机里安装Linux系统Redhat7.2. 目的:实现Windows系统里面的文件可共享给虚拟机里面Linux操作系统的目标 方案: 1> 在Windows系统里面选择一个将要作为共享的磁盘位置 2> 在该磁盘里创建一个提供共享的文件目录 3> 设定该目录共享以及共享权限 4> 虚拟机里设定是共享目录总是可见 步骤: 一.物理机上面的共享操作的设置 1. 在

windows系统下hosts文件详解

1.在windows系统下,C:\Winnt\System32\Drivers\etc里面有一个hosts文件.该文件可以用纯文本文件打开. 2.该文件里,可以配置地址映射.前面配置ip地址,后面配置对应的域名.则当计算机访问域名时,就自动映射到hosts文件里的ip上了. 3.工作原理:在windows系统里,当访问一个域名时,首先是在hosts文件里找是否有对应的映射关系.如果有,则直接访问hosts映射里的ip.如果没有,才找dns服务器上的域名,去匹配相应的ip.也就是说hosts里的配

python一些模块的exe安装包在windows的64位系统里识别不到已安装Python目录的解决方法

在windows里安装python一些模块时候,有时候源码安装比较困难,pip install也各种报错,这时候最喜欢用别人编译好的exe或者whl文件来安装,但是在windows的64位系统里,如果有一些安装包没怎么考虑过在64位系统上的安装,在安装时候就会找不到你自己安装的python目录. 解决法子:运行国外这个脚本,即可把你64位系统上的python目录添加至注册表里. # # script to register Python 2.0 or later for use with win

[笔记]使用API函数 GetACP 获取Windows系统当前代码页

代码页是字符集编码的别名,也称"内码表",是特定语言的字符集的一张表.代码页分为两种:一种是ANSI代码页:另一种是OEM代码页. ⑴OEM代码页主要是用于Windows系统中的命令行界面(Console)程序,虚拟Dos. ⑵ANSI代码页主要是用于Windows系统中本地编码不是Unicode的图形用户界面(Gui)程序. procedure TForm9.BitBtn3Click(Sender: TObject); var cpInfoEx:TcpInfoEx; begin //

摘:Windows系统内存计数器理解解析_备忘录_51Testing软件测试网...

[原创]Windows系统内存计数器理解解析 2008-05-13 11:42:23 / 个人分类:性能测试 说明:本文的计数器以Windows2003为准. 序言;F9n)\%V1a6Z C)?ZV0内存的使用情况是系统性能中重要的因素之一,频繁的页交换及内存泄露都会影响到系统的性能.本文主要是描述内存的一些概念.计数器含义,以及可能存在的性能瓶颈.4Cd%l3r(T&z y051Testing软件测试网xi[8VP?r?Q?a一些概念f2c(qDw-y&{l01Vu7t|%D} r5e

Windows系统的dll注入

声明:这篇博客原为本人在CSDN上发布的,但是CSDN这个网站违背了本人的分享和开源精神,另外CSDN的广告满天飞.审核重重(所有的下载必须使用CSDN下载,而下载需要积分,这严重违背本人的无私分享精神.开源精神.),即使审核通过也会不定时进行重新审核,CSDN的这些操作严重影响了本人的博客管理.因此,本着无私分享精神.开源精神.轻松使用原则,本人摒弃了CSDN,并将博文重新编辑并发布在博客园网站上,而原博文作删除处理! 一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在

windows系统自带命令查看硬件信息,怎样dos命令查看硬盘和内存/CPU信息

如何在windows系统自带命令查看硬件信息,怎样dos命令查看硬盘和内存/CPU信息?最直接的是:开始→运行→CMD打开命令提示符,在该窗口下输入systeminfo执行,即可看到几乎所有想知道的系统信息,甚至包括机器上已安装的网卡及其IP. 问题描述: 如何从系统中 查看主板上内存条的数量. 最佳答案: 在cmd命令下 输入:wmic memorychip list brief 就会看到内存条的数量 如何在windows系统自带命令查看硬件信息? 对于在windows下查看系统信息大家一定不

Code Page Identifiers - Copy from Microsoft

Code Page Identifiers 78 out of 94 rated this helpful - Rate this topic The following table defines the available code page identifiers. Note   ANSI code pages can be different on different computers, or can be changed for a single computer, leading

VC++开发Windows系统全局钩子

本文的大部分内容属于对一篇网文的实践与练习,同时参考的还有一本书,在此向网文与书的作者表示敬意. 这个程序是一个windows系统键盘监控程序,随着开机自动启动,可以监控系统中各用户的键盘,并将按键记录写在指定的log文件里. 程序分为两个部分:全局钩子DLL和一个隐藏的单文档应用程序. 全局钩子DLL 创建基于“MFC AppWizard(dll)”的“扩展MFC DLL(Extension MFC DLL)”类型工程KeyBoardHook 在自动生成的源文件KeyBoardHook.cpp