Ruby 1.8.7中的Ruby字符串编码

时间:2013-04-01 19:55:13

标签: objective-c c ruby character-encoding

我正在使用Ruby C API(来自Objective C)创建一个Ruby字符串,它碰巧拥有芬兰语字符。

一旦进入Ruby,我会调用一个gem进行一些操作,它会截断字符串,但编码的字符会被截断不正确 - 非常像这个问题:

How to get a Ruby substring of a Unicode string?

一个示例字符串是HpääseesyvemmälleAelämään - 变音符号变为类似\ 30333之类的东西但是当被截断时最终会变成\ 303这是一个问题。

我不想破解gem以解决这个问题,因为我已经使用Ruby中直接打开的相同字符串进行了测试,但它运行良好。

所以我知道我把错误的东西传给了Ruby。

以下是我如何将NSString转换为要在Ruby中使用的VALUE。

- (VALUE) toRubyValue {
    size_t data_length = [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    size_t buffer_length = data_length + 1;
    char buf[buffer_length];
    [self getCString:buf maxLength:buffer_length encoding:NSUTF8StringEncoding];
    return rb_str_new(buf, data_length);
}

我在Ruby 1.8.7上

解决这个问题的最佳方法是什么 - 我很高兴在Ruby或C(或Objective C)中使用它,但我宁愿不使用任何具有本机C扩展的Ruby Gems

1 个答案:

答案 0 :(得分:1)

我认为你没有错误地将某些内容传递给Ruby。您正在创建一个UTF-8编码的Ruby 1.8字符串。 Ruby 1.8并不关心编码,而是将字符串视为字节数组。这意味着任何错误的Ruby代码都可以产生您所谈论的结果。 '黑客'宝石真的是你唯一的选择。

升级到1.9甚至2.0你最好的出路。