【问题标题】:How does ruby represent strings internally?ruby 如何在内部表示字符串?
【发布时间】:2012-06-27 11:41:32
【问题描述】:

我在为 ruby​​ 创建 C 扩展时遇到了一些麻烦,这让我开始思考。我想知道 Ruby (1.9.1) 如何在内部处理字符串(以及所有编码内容)?

如果我有一个像"o" 这样的字符串,并且我将这个字符串传递给一个C-Function(如VALUE),我可以使用RSTRING_PTR()RSTRING_LEN() 宏很容易地处理它。但是,如果我创建字符串ö(德语变音符号),RSTRING_LEN() 将给我2

在这种情况下,我对RSTRING_PTR() 的内容有点困惑,这两个字节是0xA40xC3。这是什么编码?在将字符串传递给 C 函数之前,我尝试使用具有不同编码的 "ö".force_encoding( ... ),但这根本不会影响 RSTRING_PTR 的内容。

我需要一种在我的 C 函数中将字符串表示为 UTF-16(在 "ö" 的情况下为 0x00F6)中编码的 WCHAR* 的方法,但这有点难如果你不知道你来自什么编码,该怎么办......

感谢您提前提供任何帮助

【问题讨论】:

  • force_encoding 不应该改变字符串的内容,它只是改变字符串的读取方式。

标签: c ruby encoding character-encoding ruby-c-extension


【解决方案1】:

ruby 1.9 中的字符串内部结构取决于__ENCODING__ 常量和Encoding.default_internal 设置。

在您的情况下,它看起来像 UTF-8(默认),但 ö 在 UTF-8 中实际上是 c3 b6,而 c3 a4ä

【讨论】:

  • 哦,是的,你说得对,我把我的测试用例弄混了。感谢您的帮助,现在可以转换了 =)
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2020-10-05
  • 2015-08-09
  • 2011-04-16
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多