3

我正在使用 Ruby C API(来自 Objective C)创建一个 Ruby 字符串,它恰好包含芬兰语字符。

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

如何获取 Unicode 字符串的 Ruby 子字符串?

一个示例字符串是 H pääsee syvemmälle A elämään - 变音符号会变成 \30333 之类的东西,但在截断后会变成 \303,这是一个问题。

我不想破解 gem 来解决这个问题,因为我已经使用直接在 Ruby 中打开的相同字符串进行了测试,并且效果很好。

所以我知道我向 Ruby 传递了一些错误的东西。

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

- (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 Gem

4

1 回答 1

1

我不认为您将某些内容错误地传递给 Ruby。您正在创建一个 UTF-8 编码的 Ruby 1.8 字符串。Ruby 1.8 并不关心编码,而是将字符串视为字节数组。这意味着任何不正确的 Ruby 代码都可能产生您所说的结果。“破解”宝石确实是您唯一的选择。

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

于 2013-05-13T06:39:24.213 回答