objective-c - Ruby 1.8.7 中的 Ruby 字符串编码

标签 objective-c c ruby character-encoding

我正在使用 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/

相关文章:

arrays - Ruby Koans - 数组填充方法会影响它的返回方式

ios - 呈现 Uialertview 时模糊 View Controller

ios - UITextView 未检测到链接

c - 将字符串从全局指针传递到 strdup 到二维 VLA 字符串数组

java - Ruby 类实例上的等效操作(对于 Java)

ruby - 无法在 Windows xp 上的 cygwin 下为 bcrypt-ruby gem 构建 native 扩展

objective-c - ios比较两个图像/路径

iphone - 我应该什么时候释放我的阵列?

c - Getchar() 不断返回 1

c - 如何从用户那里得到一个号码