c-在编译/运行时将字符串文字的原始字节流入/流出Windows(非宽域)执行字符集,以及ANSI代码页与UTF-8
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-在编译/运行时将字符串文字的原始字节流入/流出Windows(非宽域)执行字符集,以及ANSI代码页与UTF-8,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3879字,纯文字阅读大概需要6分钟。
内容图文
我想确认一下我对Windows上的原始字符串文字和(非宽范围)执行字符集的理解.
我希望对其进行具体确认的相关段落以粗体显示.但是首先,要有一些背景.
背景
(相关问题在以下段落中以粗体显示)
作为@TheUndeadFish’s answer到this question that I posted yesterday之间的有益讨论的结果,我试图理解确定字符集和编码的规则,这些字符集和编码用作Windows上的MSVC中的执行字符集(在C规范中,执行字符集;请参见@DietmarKühl’s posting).
我怀疑有些人可能会认为甚至浪费时间去尝试理解MSVC中非ASCII字符的char *(即非宽)字符串的ANSI相关行为.
例如,考虑@IInspectable’s comment here:
You cannot throw a UTF-8 encoded string at the ANSI version of a
Windows API and hope for anything sane to happen.
请注意,在我当前基于Windows MFC的应用程序上的i18n项目中,我将删除对非宽(即ANSI)版本的API调用的所有调用,并且希望编译器生成执行宽字符集字符串,而不是内部执行字符集(非宽)字符串.
但是,我想了解现有代码,该代码已经具有使用ANSI API函数的一些国际化版本.即使有人认为ANSI API在非ASCII字符串上的行为是疯狂的,我也想理解它.
我认为,与其他人一样,我发现很难找到有关Windows上非广泛执行字符集的明确文档.
特别是,由于C标准将(非宽范围)执行字符集定义为char序列(与wchar_t相对),因此UTF-16不能在内部用于在非宽范围执行字符集中存储字符.在当今时代,有意义的是,通过UTF-8(基于字符的编码)编码的Unicode字符集将被用作执行集的字符集和编码.据我了解,在Linux上就是这种情况.但是,可悲的是,在Windows上甚至是MSVC 2013上都不是这样.
这导致了我的两个问题中的第一个.
问题1:请在以下段落中确认我是正确的.
在这种背景下,这是我的问题.在包括VS 2013在内的MSVC中,执行字符集似乎是(许多可能的)ANSI字符集之一,使用对应于特定特定ANSI字符集的(许多可能的)代码页之一来定义编码-而是而不是使用UTF-8编码的Unicode字符集. (请注意,我询问的是NON-WIDE执行字符集.)这是否正确?
背景,续(假设我在问题1中是正确的)
如果我对事情的理解正确,那么上面的粗体部分可以说是Windows上使用ANSI API的“精神错乱”的很大一部分原因.
具体来说,考虑“理智”的情况-将Unicode和UTF-8用作执行字符集.
在这种情况下,在什么机器上编译代码,何时编译都无关紧要,并且在什么机器上运行代码,何时何时编译无关紧要.字符串文字的实际原始字节将始终以Unicode字符集内部表示,并以UTF-8作为编码,并且运行时系统在语义上始终将此类字符串视为UTF-8.
在“疯狂”的情况下(如果我理解正确的话)没有这种运气,在这种情况下,ANSI字符集和代码页编码被用作执行字符集.在这种情况下(Windows世界),与在其上运行代码的计算机相比,在其上编译代码的计算机可能会影响运行时行为.
那么,这里是问题2:再次,请确认我在以下段落中是正确的.
考虑到这种持续的背景,我怀疑:具体来说,对于MSVC,执行字符集及其编码以某种不太容易理解的方式取决于编译器在运行编译器的计算机上选择的语言环境.在编译时.这将确定“烧入”可执行文件的字符文字的原始字节.并且,在运行时,MSVC C运行时库可能正在使用不同的执行字符集和编码来解释已刻录到可执行文件中的字符文字的原始字节.我对么?
(我可能会在这个问题上添加示例.)
最后评论
从根本上讲,如果我理解正确,上面的粗体段落说明了在Windows上使用ANSI API的“精神错乱”.由于编译器选择的ANSI字符集和编码与C运行时选择的ANSI字符集和编码之间可能存在差异,所以当ANSI API运行时,字符串文字中的非ASCII字符可能不会在运行的MSVC程序中按预期出现在程序中使用.
(请注意,ANSI“精神错乱”实际上仅适用于字符串文字,因为根据C标准,实际的源代码必须用ASCII子集编写(并且源代码注释被编译器丢弃).)
上面的描述是我对Windows上的ANSI字符串的最新理解.我想确认我的解释格式正确,理解正确.
解决方法:
故事很长,我很难找到一个明确的问题.但是,我认为我可以解决导致此问题的许多误解.
首先,“ ANSI”是(狭窄)执行字符集的同义词. UTF-16是执行宽字符集.
编译器不会为您选择.如果使用窄字符字符串,就编译器(运行时)所知,它们是ANSI.
是的,特定的“ ANSI”字符编码可能很重要.如果在PC上编译了L“ä”文字,并且源代码在CP1252中,则该ä字符将被编译为UTF-16ä.但是,相同的字节可能是其他编码中的另一个非ASCII字符,这将导致产生不同的UTF-16字符.
但是请注意,MSVC完全可以编译UTF-8和UTF-16源代码,只要它以U FEFF“ BOM”开头即可.这使得整个理论问题几乎不是问题.
[编辑]
“特别是,对于MSVC,执行字符集及其编码取决于…”
不,MSVC确实与执行字符集无关. char(0xE4)的含义由操作系统确定.要查看此信息,请检查MinGW编译器. MinGW产生的可执行文件的行为与MSVC相同,因为两者都针对同一操作系统.
内容总结
以上是互联网集市为您收集整理的c-在编译/运行时将字符串文字的原始字节流入/流出Windows(非宽域)执行字符集,以及ANSI代码页与UTF-8全部内容,希望文章能够帮你解决c-在编译/运行时将字符串文字的原始字节流入/流出Windows(非宽域)执行字符集,以及ANSI代码页与UTF-8所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。