我在创建一个让我思考的ruby的C-Extension时遇到了一些麻烦。我想知道Ruby(1.9.1)如何在内部处理字符串(以及所有编码内容)?
如果我有一个像"o"
这样的字符串,并且我将字符串传递给C函数(作为VALUE
),我可以使用RSTRING_PTR()
和RSTRING_LEN()
轻松处理它ö
宏。但是,如果我创建字符串RSTRING_LEN()
(德语变音符号),2
会给我RSTRING_PTR()
。
在这种情况下,我对0xA4
的内容感到有点难过,两个字节是0xC3
和"ö".force_encoding( ... )
。这是什么编码?在将字符串传递给C函数之前,我尝试使用RSTRING_PTR
使用不同的编码,但这根本不会影响WCHAR*
的内容。
我需要的是一种方法,将UTF-16
中编码的字符串表示为"ö"
(在0x00F6
的情况下,即{{1}}) C函数,但如果你不知道你来自哪个编码,这很难做到......
答案 0 :(得分:2)
ruby 1.9中的字符串内部结构取决于__ENCODING__
常量和Encoding.default_internal
设置。
在您的情况下,它看起来像UTF-8(默认),但ö
在UTF-8中实际为c3 b6
,c3 a4
为ä