Tag: 字符编码

如何获取多字节字符串的字节大小

如何在Visual C中获取多字节字符串的字节大小? 有function还是我必须自己计算角色? 或者,更一般地说,如何获得TCHAR字符串的正确字节大小? 解: _tcslen(_T(“TCHAR string”)) * sizeof(TCHAR) 编辑: 我只是谈论以空字符结尾的字符串。

你如何应对标准库中签名的char – > int问题?

这是我工作中一个长期存在的问题,我意识到我仍然没有一个很好的解决方案…… C天真地为int定义了它的所有字符测试函数: int isspace(int ch); 但是char经常被签名,并且一个完整的角色通常不适合int,或任何用于字符串******的单个存储单元。 这些函数已成为当前C ++函数和方法的逻辑模板,并为当前的标准库奠定了基础。 事实上,他们仍然得到了支持。 因此,如果您使用isspace(* pchar),最终可能会出现符号扩展问题。 他们很难看到,因此根据我的经验他们很难防范。 类似地,因为isspace()和它的所有类型都是内联的,并且因为字符串的实际宽度通常是未知的,而不是字符串分析 – 这意味着任何现代字符库本质上都不应该只是在char或wchar_t周围,而只是指针/迭代器,因为只有通过分析字符流才能知道它有多少组成一个逻辑字符,我对如何最好地解决这些问题感到有些不知所措? 我一直在期待一个真正强大的库,它基于抽象出任何字符的大小因素,并且只使用字符串(提供诸如isspace之类的东西等),但要么我错过了,要么是另一个更简单的解决方案盯着我面对所有人(谁知道你在做什么)使用…… **这些问题不适用于可以完全包含完整字符的固定大小的字符编码 – UTF-32显然是唯一具有这些特征的选项(或者将自己局限于ASCII或其他特殊环境的专用环境) 。 所以,我的问题是: “你如何以不受两个问题影响的方式测试空白,可打印等等: 1)标志扩展,和 2)可变宽度字符问题 毕竟,大多数字符编码都是可变宽度:UTF-7,UTF-8,UTF-16,以及Shift-JIS等旧标准。 如果编译器将char视为带符号的8位单元,即使扩展ASCII也可能具有简单的符号扩展问题。 请注意: 无论char_type的大小是多少,对于大多数字符编码方案来说都是错误的。 这个问题出现在标准C库以及C ++标准库中; 仍尝试传递char和wchar_t,而不是各种isspace,isprint等实现中的字符串迭代器。 实际上,正是这些类型的函数破坏了std :: string的通用性。 如果它只在存储单元中工作,并且没有试图假装将存储单元的含义理解为逻辑字符(例如isspace),那么抽象将更加诚实,并且会迫使程序员看起来其他有效的解决方案…… 谢谢 参与的每个人。 在这个讨论和WChars,编码,标准和可移植性之间,我可以更好地处理这些问题。 虽然没有简单的答案,但每一点理解都有帮助。

我在哪里可以找到每个C99字符集的所有字符的表格?

我正在为以下每个C字符集中的每个字符寻找一个表(或生成一个表的方法): 基本字符集 基本执行字符集 基本源字符集 执行字符集 扩展字符集 源字符集 C99在5.2.1节中提到了所有这六个。 但是,我发现阅读非常神秘,缺乏细节。 它明确定义的唯一字符集是基本执行字符集和基本源字符集 : 拉丁字母表中的52个大写和小写字母: ABCDEFGHIJKLMNOPQRSTU VWXYZ abcdefghijklmnopqrstu vwxyz 十位小数: 0 1 2 3 4 5 6 7 8 9 29个图形字符: ! “#%&’()* +, – 。/:; ?[\ _] ^ _ {|}〜 4个空格字符: 空格,水平标签,垂直标签,换页 我相信这些与基本字符集相同,但我猜测C99没有明确说明这一点。 其余的字符集对我来说有点神秘。 谢谢你尽你所能的帮助! 🙂

在C中从二进制转换为char

我对如何从二进制值转换为c中的char感到困惑。 例如,假设我有01010110,并希望从中打印相应的字母’V’。 我该怎么做呢? 谢谢你的帮助!

签署一个字符是什么意思?

鉴于有符号和无符号整数使用相同的寄存器等,并且只是不同地解释位模式,C字符基本上只是8位整数,C中有符号和无符号字符之间的区别是什么? 我理解char的签名是实现定义的,我根本无法理解它是如何产生影响的,至少当char用于保存字符串而不是数学时。

请解释这个结果。 printf(“%c”,“abcd”)

#include int main() { printf(“%c\n”, ‘abcd’); printf(“%p\n”, ‘abcd’); printf(“%c\n”, 0x61626364); printf(“%c\n”, 0x61626363); printf(“%c\n”, 0x61626365); return 0; } 我想问这一行:printf(“%c \ n”,’abcd’); 在这一行中,结果是“d”但是,我无法理解为什么’d’会出现。 我试着看看其他的回忆。 在这种情况下,我发现其他记忆都包含所有字母。 请解释一下为什么结果是’d’以及为什么其他记忆都有所有字母。 谢谢。

Windows代码页与标准C / C ++文件名的交互?

客户抱怨我们的代码用于在文件名中写入带有日文字符的文件,但在所有情况下都不再有效。 我们总是使用好的旧char *字符串来表示文件名,所以它对我来说有点令人震惊,它曾经有效,我们没有做任何我知道应该让它停止工作的事情。 我让他们发给我一个带有嵌入式文件名的文件,从我们的软件导出它,看起来字符串使用hex字符82和83作为双字节序列的第一个字符来表示日文字符。 在线浏览让我相信这可能是SHIFT_JIS和/或Windows代码页932。 在我看来,之前发生的事情是使用此代码页的fopen和ofstream :: open接受的文件名; 现在只有fopen呢。 我已经检查了Visual Studio fopen docs,我没有看到什么使得可接受的字符串传递给fopen。 在短期内,我希望有人可以为我提供一些关于特定Windows fopen与ofstream :: open问题的信息。 从长远来看,我真的想知道在Windows,Linux和OS X上用C ++打开Unicode(和其他?)文件名的可接受方式。 编辑添加:我认为开放工作是在“C”语言环境中完成的,而那些不工作的开放是在客户的默认语言环境中完成的。 然而,多年以来一直如此,该程序的旧版本今天仍在他们的系统上运行,所以这似乎是解释我们所看到的问题的一个远景。 更新:我向客户发送了一个小测试程序。 它已经validationfopen与SHIFT_JIS文件名一起工作正常,而std :: ofstream则没有。 这是在Visual Studio 2005中,无论我使用的是默认语言环境还是“C”语言环境,都会发生这种情况。 我仍然感兴趣,如果有人对这种行为有解释(为什么它会神秘地改变 – 也许是VS2005的服务包?)并且希望在便携式C ++代码中整理一个全面的“最佳实践”来处理Unicode文件名。

即使char已签名,’a’和’0’也始终具有正值?

根据环境和编译器设置,默认情况下char类型可以是有符号或无符号的,这意味着8位2s补码系统上单字符常量的值范围可以是-128..127或0..255 。 在无处不在的ASCII字符集中,其ISO-8859-X扩展或UTF-8编码,大写和小写字母以及数字的值低于127。 但是EBCDIC字符集不是这种情况: ‘A’是0xC1, ‘a’是0x81而’1’是0xF1。 由于这些值大于127,是否意味着char类型必须在8位EBCDIC系统上无符号? 或者’a’ , ‘A’和’1’有否定值? 其他字符集怎么样? 字母或数字可以有负值吗?

C标准:字符集和字符串编码规范

我发现C标准(C99和C11)在字符/字符串代码位置和编码规则方面含糊不清: 首先,标准定义the source character set和the execution character set 。 本质上它提供了一组字形,但没有将任何数值与它们相关联 – 那么什么是默认字符集? 我不是在这里询问编码,而只是字形/曲目到数字/代码点映射。 它确实将universal character names定义为ISO / IEC 10646,但它是否说这是默认的字符集? 作为上述的扩展 – 我找不到任何说明数字转义序列\ 0和\ x代表什么字符的内容。 从C标准(C99和C11,我没有检查ANSI C)我得到了关于字符和字符串文字的以下内容: +———+—–+————+———————————————-+ | Literal | Std | Type | Meaning | +———+—–+————+———————————————-+ | ‘…’ | C99 | int | An integer character constant is a sequence | | | | […]

如果字符串中有非ASCII字符,如何将C字符串(char数组)转换为Python字符串?

我在C程序中嵌入了一个Python解释器。 假设C程序从文件中读取一些字节到char数组,并且(以某种方式)学习字节表示具有特定编码的文本(例如,ISO 8859-1,Windows-1252或UTF-8)。 如何将此char数组的内容解码为Python字符串? Python字符串通常应该是unicode类型 – 例如,Windows-1252编码输入中的0x93变为u’\u0201c’ 。 我试图使用PyString_Decode ,但是当字符串中有非ASCII字符时它总是会失败。 这是一个失败的例子: #include #include int main(int argc, char *argv[]) { char c_string[] = { (char)0x93, 0 }; PyObject *py_string; Py_Initialize(); py_string = PyString_Decode(c_string, 1, “windows_1252”, “replace”); if (!py_string) { PyErr_Print(); return 1; } return 0; } 错误消息是UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u201c’ in position 0: […]