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

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

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

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

  1. 全网最详细的Windows系统里PLSQL Developer 32bit的下载与安装过程(图文详解)

    不多说,直接上干货! 注意的是: 本地若没有安装Oracle服务端,Oracle server服务端32位,是远程连接,因此本地配置PLSQL Developer32位. PLSQL Develope ...

  2. 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  3. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  4. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cm ...

  5. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的完全卸载(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 若你不想用了,则可安全卸载. 完全卸载Oracle ...

  6. 全网最详细的Windows系统里Oracle 11g R2 Database服务器端(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  7. 全网最详细的Windows系统里PLSQL Developer 64bit安装之后的一些配置(图文详解)

    不多说,直接上干货! 注意的是: 本地若没有安装Oracle服务端,Oracle server服务端64位,是远程连接,因此本地配置PLSQL Developer64位. PLSQL Develope ...

  8. 全网最详细的Windows系统里PLSQL Developer 64bit的下载与安装过程(图文详解)

    不多说,直接上干货! ORACLE是数据库,有客户端和服务器: 其,具体下载,可见http://www.oracle.com/technetwork/database/enterprise-editi ...

  9. windows系统里Cygwin中如何正确安装wget(图文详解)

    具体步骤,见如下: https://ftp.gnu.org/gnu/wget/ 解压到Cygwin的主目录中,一般是   你的Cygwin目录/home/当前用户名/ . 我这是如下     先./c ...

随机推荐

  1. JDiPad项目runtime的使用分析

    首先,项目有点老 但是运行还是没有问题的.其中很多地方到了runtime,同时也看到了 早期的开发人员 基本没用pod 第三方也很少用,除了微信登录,整个项目还没看到集成的第三方SDK.然后慢慢梳理 ...

  2. iOS怎么来实现关闭自动锁屏

    怎么来设置[UIApplication sharedApplication]   idleTimerDisabled 属性来控制自动锁屏的效果 // 把设置idleTimerDisabled的代码放到 ...

  3. 02-C与OC语言的一些小知识

    1.        #import 跟#include.@class有什么区别?#import<> 跟 #import”"又什么区别? 1>  #import和#inclu ...

  4. 【剑指offer】包含min函数的栈,C++实现

    博客文章索引地址 博客文章中代码的github地址 1.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中调用push.pop.top.min的时间复杂度都是o(1) ...

  5. 51Nod 1439:互质对(用莫比乌斯来容斥)

    有n个数字,a11,a22,…,ann.有一个集合,刚开始集合为空.然后有一种操作每次向集合中加入一个数字或者删除一个数字.每次操作给出一个下标x(1 ≤ x ≤ n),如果axx已经在集合中,那么就 ...

  6. BZOJ2217 Poi2011 Lollipop 【思维+模拟】

    Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T"). 现在有m个询问,每个询问是询问有没有一个 ...

  7. Python学习-第三方库操作

    2018-05-04   12:03:19 Python安装模块,更新模块 #显示模块 pip list #显示过期模块 pip list --outdated #安装模块 pip install x ...

  8. Appium定位 5 ——xpath

    今天我们先来和大家说一下appium,上一次说到了定位,不知道大家定位的怎么样了,今天来说如何定位xpath,五分钟即可学会: 例1: 现在我想定位下面这个登录按钮: xpath该怎么写呢? 先不管三 ...

  9. SEO方案

    前端需要注意哪些SEO 合理的title.description.keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面title要有 ...

  10. verilog中的有符号数理解(转)

    verilog中的有符号数运算 有符号数的计算:若有需要关于有号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制. Ex: input  signed [7:0] ...