- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我习惯于处理 ASCII 字符串,但现在使用 UNICODE 我对某些术语感到非常困惑:
什么是多字节字符,什么是 widechar
有什么不同?
多字节是指内存中包含多于一个字节的字符吗和widechar
只是一种数据类型来表示吗?
MultiByteToWideChar
转换和 WideCharToMultiByte
? wchar_t* wcMsg = L"مرحبا";
MessageBoxW(0, wcMsg, 0, 0);
UNICODE
,它会正确打印消息但是为什么我没有从
WideCharToMultiByte
在这里转换??
_MBCS
和 UNICODE
? 最佳答案
ASCII 字符串的字符宽度为 1 个字节(通常为 8 位,很少为 7、9 或其他位宽)。这是当时的遗留问题,当时内存大小非常小且昂贵,而且处理器通常每条指令只能处理一个字节。
很容易想象,一个字节远远不足以存储世界上所有可用的字形。仅中文就有 87.000 个字形。一个字符通常只能处理 256 个字形(8 位字节)。 ASCII仅定义 96 个字形(加上较低的 32 个字符,它们被定义为不可打印的控制字符),这使其成为 7 位字符集。这对于英文上下字符、数字以及一些标点符号和其他字形来说已经足够了。 ASCII 不使用公共(public) 8 位字节中的最高位。
要处理多于一个字节可以容纳的字形,一种方法是将基本字形存储在一个字节中,将其他常见字形存储在两个字节中,将很少使用的字形存储在 3 个甚至更多字节中。这种方法被称为Multi byte char set or Variable-width encoding .一个非常常见的例子是 UTF 8 , 一个字符使用 1 到 4 个字节。它将 ASCII 字符集存储在一个字节中(因此它也向后兼容 ASCII)。最高位被定义为一个开关:如果它被设置,其他字节将跟随。这同样适用于以下字节,从而形成最多 4 个字节的“链”。
可变宽度字符集的优点是:
myString[n]
提供一个字形;相反,如果后面有更多字节,您必须评估每个字节。 MultiByteToWideChar
为你做,和
WideCharToMultiByte
反之亦然。还有一些其他的转换函数和库。
wchar_t
,在 Windows 的情况下意味着 UTF16。不幸的是
wchar_t
的宽度可能因编译器而异;在 Unix 下它通常是 UTF32,在 Windows 下它是 UTF16。
_MBCS
是一个自动预处理器定义,它告诉您您已将字符集定义为多字节,
UNICODE
告诉您已将其设置为 UTF16。
wchar_t* wcMsg = L"مرحبا";
MessageBoxW(0, wcMsg, 0, 0);
UNICODE
的程序中定义集。
L"
前缀定义,您的字符串是
UNICODE
(wide char) 字符串,你可以用它调用系统函数。
char* msg = u8"مرحبا";
MessageBoxA(0, msg, 0, 0);
u8
将字符串定义为 UTF8。 .但是带有“A”后缀的 Windows 函数不理解 UTF8,至少在 Windows 10 Build 17035 之前(参见 tambre 的评论)(另请参见
https://stackoverflow.com/a/504789/2328447 )
TCHAR
,
_T()
以及所有不带后缀的依赖于字符串的 Windows 函数,例如
MessageBox()
(没有
W
或
A
后缀)
TCHAR
将扩展为
char
,
_T()
将扩展为空,Windows 函数将获得
A
附后缀。
TCHAR
将扩展为
wchar_t
,
_T()
将扩展到
L
前缀,Windows 函数将得到
W
附后缀。
TCHAR* msg = _T("Hello");
MessageBox(0, msg, 0, 0);
TCHAR* msg = _T("مرحبا");
MessageBox(0, msg, 0, 0);
_T()
不会扩展为
u8
)
关于c++ - 为什么我们从 MultiByte 转换为 WideChar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237696/
多年来,我的所有 PHP 脚本都使用不带 BOM 的 UTF8 编码,它们工作正常。今天我发现有一个名为zend.multibyte 的核心指令,它默认为零(禁用)。 那么,如果它不影响脚本解析..它
这里有 3 个库支持以下字符集: Lib A (支持Unicode和Multibyte) Lib B(仅多字节) Lib C(仅 Unicode) A 有一个函数,在 Unicode 和多字节的情况下
我习惯于处理 ASCII 字符串,但现在使用 UNICODE 我对某些术语感到非常困惑: 什么是多字节字符,什么是 widechar有什么不同? 多字节是指内存中包含多于一个字节的字符吗和widech
我的输入数据来自一个平面文件,该文件在一列中包含英文、日文、中文字符。 我将这些值加载到架构定义为 VARCHAR2(250 CHAR) 的临时表列中,主表列的定义为 VARCHAR2(250),我无
我正在尝试解码 shift-jis 编码的字符串,如下所示: string.decode('shift-jis').encode('utf-8') 能够在我的程序中查看它。 当我遇到 2 个 shif
我最近更新了 Gemfile 上的 gem 并开始获得: irb(main):002:0> User.new(:email => "foob@gmail.com").valid? TypeError:
在尝试通过 PHP 的 htmlentities 函数运行字符串时,我遇到了一些“无效的多字节序列”错误。有没有办法在调用函数之前清理字符串以防止发生此错误? 最佳答案 从 PHP 5.4 开始,您应
我在我的本地站点中遇到此错误。 Warning (2): htmlspecialchars(): Invalid multibyte sequence in argument in [/var/www
当我从文件 Posti-Letto-Istat.xls 中读取任何表格时与 read_excel来自 readxl包我没有问题: library(readxl) pl_istat1 = 8 x64 (
我又一次在 java natve 接口(interface)上胡思乱想,遇到了另一个有趣的问题。我正在通过 jni 将文件路径发送到 c,然后执行一些 I/O。所以我遇到的最常见的字符是 'äåö'。
"קמ"ד חיר!" 是从 gdb 中的变量打印粘贴的输入字符串拷贝。调用 mbstowcs 返回 -1,另一个输入为 NULL。关于问题出在哪里/如何解决这个问题有什么想法吗? "\327\247
我的老师教我们如何使用“exec”,但我得到了一个错误: UnicodeDecodeError: 'cp950' codec can't decode byte 0xe6 in position 18
我有一个需要匹配一堆字符的正则表达式。代码在 ruby 1.8.7 中没有问题,但在 1.9 中它就结束了。我想这与编码有关,我已经进行了大量的谷歌搜索,所以也许有人可以启发我。 代码: # en
我正在创建一个 sublime 文本突出显示文件。但是,我遇到了一个我不完全理解的错误。我有以下正则表达式: \x([0-9]|[A-F]|[a-f])([0-9]|[A-F]|[a-f]) 当我尝试
使用 Complete C++ i18n gettext() “hello world” example我将区域设置从“es_MX”更改为“pl_PL”,并将文本从“hello, world!”更改为
您好,我已经看到这个问题是围绕陷阱提出的,但是到目前为止,当我尝试使用它们时,我看到的所有示例都没有帮助我。我收到错误 “iconv():在输入字符串中检测到一个不完整的多字节字符”,在某些输入上。同
我试图理解为什么这段代码在 Ruby 1.9.2 中不起作用我还试图弄清楚应该如何更改它才能使其工作。这是片段: ruby-1.9.2-p290 :009 > str = "hello world!"
我怎么能在每个单词之后都内爆性格呢?。我尝试了以下几种方法:。但它总是忽略一个词。例如:测试测试将给我测试,测试将给我测试,测试将给我测试。我还尝试了$QUERY=INPRODE(“*”,str_pl
我想从 url 中获取 html 内容,并用正则表达式解析 html 内容。但是 html 内容有一些多字节字符。所以我遇到了标题中描述的错误。 谁能告诉我如何解决这个问题? 最佳答案 您需要编辑您的
这是 cygwin。 我有一个共享库,其中包含一些其他共享库和一些静态库。当调用 dlopen() 时,返回一个句柄,但 perror() 返回 NULL 和“无效或不完整的多字节或宽字符” 很明显,
我是一名优秀的程序员,十分优秀!