- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读 Windows 上的字符集和编码。我注意到在 Visual Studio 编译器(用于 C++)中有两个编译器标志,称为 MBCS 和 UNICODE。它们之间有什么区别?我没有得到的是 UTF-8 在概念上与 MBCS 编码有何不同?另外,我在 MSDN 中找到了以下引述:
Unicode is a 16-bit character encoding
这否定了我读到的关于 Unicode 的一切。我认为unicode可以用不同的编码编码,例如UTF-8和UTF-16。有人可以进一步阐明这种困惑吗?
最佳答案
I noticed that there are two compilerflags in Visual Studio compiler (forC++) called MBCS and UNICODE. What isthe difference between them ?
Windows API 中的许多函数有两个版本:一个采用 char
参数(在特定于语言环境的代码页中),另一个采用 wchar_t
参数(在UTF-16)。
int MessageBoxA(HWND hWnd, const char* lpText, const char* lpCaption, unsigned int uType);
int MessageBoxW(HWND hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);
这些函数对中的每一个都有一个没有后缀的宏,这取决于是否定义了UNICODE
宏。
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
为了实现这一点,TCHAR
类型被定义为抽象出 API 函数使用的字符类型。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
然而,这 was a bad idea .您应该始终明确指定字符类型。
What I am not getting is how UTF-8 isconceptually different from a MBCSencoding ?
MBCS 代表“多字节字符集”。对于字面意思,UTF-8 似乎符合条件。
但在 Windows 中,“MBCS”仅指可与 Windows API 函数的“A”版本一起使用的字符编码。这包括代码页 932 (Shift_JIS)、936 (GBK)、949 (KS_C_5601-1987) 和 950 (Big5),但不是 UTF-8。
要使用 UTF-8,您必须使用 .MultiByteToWideChar
将字符串转换为 UTF-16,调用函数的“W”版本,然后调用 WideCharToMultiByte
在输出上。这本质上就是“A”函数的实际作用,这让我想知道 why Windows doesn't just support UTF-8
无法支持 the most common character encoding使 Windows API 的“A”版本无用。因此,您应该始终使用“W”函数。
更新:自 Windows 10 build 1903(2019 年 5 月更新)起,UTF-8 is now supported as an "ANSI" code page.因此,我最初(2010 年)建议始终使用“W”函数不再适用,除非您需要支持旧版本的 Windows。参见 UTF-8 Everywhere获取文本处理建议。
Unicode is a 16-bit character encoding
This negates whatever I read about theUnicode.
MSDN 是错误的。 Unicode 是一个 21 位编码的字符集,有多种编码,最常见的是 UTF-8、UTF-16 和 UTF-32。 (还有其他 Unicode 编码,例如 GB18030、UTF-7 和 UTF-EBCDIC。)
每当 Microsoft 提及“Unicode”时,它们实际上指的是 UTF-16(或 UCS-2)。这是出于历史原因。 Windows NT 是 Unicode 的早期采用者,当时 16 位被认为对每个人都足够了,而 UTF-8 仅在 Plan 9 上使用。因此 UCS-2 是 Unicode。
关于windows - Windows 上 MBCS 和 UTF-8 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298569/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!