C扩展名中的unicode字符串

C扩展名中的unicode字符串,c,ruby,C,Ruby,我正在为Ruby编写一个C扩展,我需要接受一个字符串作为参数,并迭代字符串中的字符。我下面的代码可以很好地处理ASCII字符,但它不处理多字节字符,而是输出“垃圾”。我找不到任何迭代unicode字符串的示例代码。如果有人给我指点,我将不胜感激 static VALUE test_method(VALUE self, VALUE text) { char *pch; char *pch_end = RSTRING_END(text); for (pch = RSTRIN

我正在为Ruby编写一个C扩展,我需要接受一个字符串作为参数,并迭代字符串中的字符。我下面的代码可以很好地处理ASCII字符,但它不处理多字节字符,而是输出“垃圾”。我找不到任何迭代unicode字符串的示例代码。如果有人给我指点,我将不胜感激

static VALUE test_method(VALUE self, VALUE text)
{
    char *pch;
    char *pch_end = RSTRING_END(text);

    for (pch = RSTRING_PTR(text); pch < pch_end; pch++)
    {
        printf("%c\n", *pch);
    }
    ...
}
静态值测试方法(值自身、值文本)
{
char*pch;
char*pch_end=RSTRING_end(文本);
用于(pch=RSTRING_PTR(文本);pch
char
的大小仅为1,因此如果处理多字节字符,则必须使用
wchar\u t
,并使用适当的宽版本,如
wprintf
,下面是一个可以迭代字符的方法示例:

静态值打印\u单个字符(值s)
{
char*pch;
pch=StringValueCStr(s);
//pch现在是一个指针,指向表示
//字符的编码是什么。如果
//控制台编码是相同的,否则您可能会再次收到垃圾邮件。
printf(“%s\n”,pch);
返回Qnil;
}
静态值测试法(值自身、值文本)
{
rb_块调用(text,rb_intern(“每个字符”),0,NULL,print_single_字符,Qnil);
返回Qnil;
}
请注意,一旦将任何字符转换为C字符串,就会丢失任何相关的编码信息。在执行任何其他操作之前,您可能希望将任何输入转换为已知编码(如UTF-8):

text=rb_funcall(text,rb_intern(“encode”),1,rb_str_new_cstr(“utf-8”);

如果我的字符串是UTF8,那么我需要检查每个字符的宽度。有API吗?所以你的意思是你得到一个指针,你事先不知道这是哪种字符串?
wchar\u t
有固定大小(32位?),但是UTF8字符串可以有不同长度的字符(从一个字节到,我想,五个字节)。“wchar\u t有固定大小(32位?)——在linux上;在windows上使用utf16,因此wchar\u t为2字节,代码点为1或2 wchar\u t。