C:编写宏来构建字符串转义序列

标签 c macros character-encoding c-preprocessor c-strings

我正在使用一些以 Shift-JIS 格式打印文本的日语 C 代码。在原始代码中,文本直接以假名形式写入字符串文字中。在我需要 UTF-8 的编辑器中,它显示为无意义。

特别是此代码喜欢使用“大”版本的英文字母:http://www.rikai.com/library/kanjitables/kanji_codes.sjis.shtml例如\x82\x60 = A(一个大的“A”,ASCII 中的\x41)。我想我应该编写一个 CPP 宏来将它们从 ASCII 转换,例如:

#define LARGE_LETTER(x) "\x82\x" (x+31)

但显然,这个宏不太起作用,而且我不确定如何让它起作用(如果可能的话)。你能构建这样的字符串转义序列吗?

最佳答案

首先,为什么不有很多定义

#define LARGE_LETTER_A "\x82\x60"
#define LARGE_LETTER_B "\x82\x61"
…
#define LARGE_LETTER_Z "\x82\x7A"

使用

char *str = "foo " LARGE_LETTER_A " baz";

接下来,您可以使用 primitive cat 将其提升一个档次

#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define LARGE_LETTER(x) PRIMITIVE_CAT(LARGE_LETTER_, x)

用法:

char *str = "foo " LARGE_LETTER(A) " baz";

关于C:编写宏来构建字符串转义序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070063/

相关文章:

c - 关于 break 语句

c++ - 什么是类型安全以及 "type safe"替代方案是什么?

c - C 中的 Pthread 和信号分配

c++ - 在这种情况下,我如何在选择时强制进行 C++ 宏替换?

php - 在哪里定义MySQL字符集

java - 如何将动态编译的字节重新编码为文本?

我可以将 jpeg 或 mjpeg 文件从硬盘传输到 GPU 内存吗?

c - 宏 _bnd(X,bnd) 是什么意思?

c++ - 可以用宏来抽象这个逻辑吗?

windows - 带有 Ada 的 Windows 上的 UTF-8