Ruby 1.8.7 中的 Ruby 字符串编码

3
我正在使用Ruby C API(从Objective C)创建一个Ruby字符串,其中包含芬兰字符。
在Ruby中,我调用了一个gem进行一些操作,它截断了字符串,但是编码的字符被不正确地截断了 - 就像在这个问题中一样: 如何获取Unicode字符串的Ruby子字符串? 一个示例字符串是H pääsee syvemmälle A elämään - 元音字母变成了类似于\30333的字符,但是当被截断时,它会变成\303,这是一个问题。
我不想通过黑客手段解决这个问题,因为我已经测试了直接在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 Gems。

我没有找到解决方案,所以我不得不使用问题中SO链接中的解决方案来破解这个宝石。也许有人知道正确的做法,所以我会把这个问题留着开放的。 - petenelson
1个回答

1
我认为你没有将任何不正确的内容传递给Ruby。你正在创建一个UTF-8编码的Ruby 1.8字符串。但是,Ruby 1.8不关心编码,并将字符串视为字节数组。这意味着任何不正确的Ruby代码都可能产生你所说的结果。 “黑客”这个宝石确实是你唯一的选择。
升级到1.9甚至2.0是你最好的出路。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接