我正在使用 Ruby C API(来自 Objective C)创建一个 Ruby 字符串,它恰好包含芬兰语字符。
在 Ruby 中,我调用了一个 gem,它执行一些截断字符串的操作,但编码的字符被不正确地截断 - 非常像这个问题:
How to get a Ruby substring of a Unicode string?
一个示例字符串是 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 Gems
最佳答案
我不认为您向 Ruby 传递了错误的东西。您正在创建 UTF-8 编码的 Ruby 1.8 字符串。 Ruby 1.8 并不关心编码,而是将字符串视为字节数组。这意味着任何不正确的 Ruby 代码片段都可能产生您所说的结果。 “破解” gem 确实是您唯一的选择。
升级到 1.9 甚至 2.0 是您最好的出路。
关于objective-c - Ruby 1.8.7 中的 Ruby 字符串编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15750732/