我正在使用一些以 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/