Ruby 如何停止Sequel';s postgres pr适配器返回错误编码的数据?

Ruby 如何停止Sequel';s postgres pr适配器返回错误编码的数据?,ruby,postgresql,encoding,sequel,Ruby,Postgresql,Encoding,Sequel,我从适配器中得到了错误的编码,这是Sequel建议的编码之一 我做错什么了吗? 示例代码: 输出: 不用说,我从续集本身得到了同样的结果。我的数据库不是用ASCII编码的,而是UTF8 现在我需要使用Ruby和JRuby与PostgreSQL交谈,在每种情况下尝试使用相同的工具链是有意义的,因此这是显而易见的适配器。但是 杰里米·福克斯的行为也一样 我可以通过全面强制编码来解决这个问题,但这将是我所有代码中最痛苦的事情 我可能应该提供一些额外的答案(谢谢): 版本->Centos 7;R

我从适配器中得到了错误的编码,这是Sequel建议的编码之一

我做错什么了吗?

示例代码:

输出:

不用说,我从续集本身得到了同样的结果。我的数据库不是用ASCII编码的,而是UTF8

  • 现在我需要使用Ruby和JRuby与PostgreSQL交谈,在每种情况下尝试使用相同的工具链是有意义的,因此这是显而易见的适配器。但是

  • 杰里米·福克斯的行为也一样

  • 我可以通过全面强制编码来解决这个问题,但这将是我所有代码中最痛苦的事情


我可能应该提供一些额外的答案(谢谢):

  • 版本->Centos 7;Ruby 2.3.1和JRuby 9.1.1.0;gem版本0.6.6
  • 操作系统区域设置->“LANG=en_GB.UTF-8”
  • Ruby defaults->Encoding.default\u internal=nil;默认值\外部=编码::UTF-8

postgres pr
不支持编码。这不是我计划增加的东西,但我愿意考虑补丁。


您可以使用
force_encoding
Sequel::Model插件修复编码,至少在您使用模型的地方是这样。

postgres pr
不支持编码。这不是我计划增加的东西,但我愿意考虑补丁。


您可以使用
force_encoding
Sequel::Model插件来修复编码,至少在您使用模型的地方是这样。

我在我的一个数据库上尝试了您的代码示例,一切正常。 您的设置可能有什么特别之处?您可以使用

p c.query("SHOW client_encoding;").rows.first
并且应该能够使用以下方式进行设置:

p c.query("SET CLIENT_ENCODING TO 'UTF-8';")
在Andy Jones的一些反馈和Jeremy的评论之后,我进一步研究了源代码。编辑问题,这样我就有了比评论更好的格式选项

驱动程序从流中读取US-ASCII,如下所示:

    buffer.copy_from_stream(stream, length-4)

这反过来调用
缓冲区#write
,它将数据插入自己的
@内容中

@content[@position, sz] = str

现在@content是一个特定大小的字符串,填充有#符号,它是这样创建的:

def self.of_size(size)
  raise ArgumentError if size < 0
  new('#' * size
end

这个冗长的解释只是想说:我不明白为什么您会看到US-ASCII输出:-(

除非:您的系统未设置为以某种奇怪的方式使用UTF-8

Ruby 1.9的默认编码是US-ASCII,Ruby 2.2的默认编码是UTF-8(或者更早,不确定?)

你有电话吗

# encoding: 
是否在文件开头设置注释样式

如果你这样做会发生什么

puts String.new.encoding
它的价值是什么

puts __ENCODING__
它的价值是什么

puts RUBY_VERSION

请签入运行db测试脚本的同一个文件。

我在我的一个DBs上尝试了您的代码示例,一切正常。 可能是您的设置有什么特殊之处?您可以使用

p c.query("SHOW client_encoding;").rows.first
并且应该能够使用以下方式进行设置:

p c.query("SET CLIENT_ENCODING TO 'UTF-8';")
在Andy Jones的一些反馈和Jeremy的评论之后,我进一步研究了源代码。编辑问题,这样我就有了比作为评论更好的格式选择

驱动程序从流中读取US-ASCII,如下所示:

    buffer.copy_from_stream(stream, length-4)

这反过来调用
缓冲区#write
,它将数据插入自己的
@内容中

@content[@position, sz] = str

现在@content是一个特定大小的字符串,填充有#符号,它是这样创建的:

def self.of_size(size)
  raise ArgumentError if size < 0
  new('#' * size
end

这个冗长的解释只是想说:我不明白为什么您会看到US-ASCII输出:-(

除非:您的系统未设置为以某种奇怪的方式使用UTF-8

Ruby 1.9的默认编码是US-ASCII,Ruby 2.2的默认编码是UTF-8(或者更早,不确定?)

你有电话吗

# encoding: 
是否在文件开头设置注释样式

如果你这样做会发生什么

puts String.new.encoding
它的价值是什么

puts __ENCODING__
它的价值是什么

puts RUBY_VERSION

请签入运行db测试脚本的同一文件。

理解这里发生的事情的关键是ruby编码的多个设置。有:

  • 使用magic注释或-k命令行开关设置的区域设置编码

  • 默认的外部编码,使用
    编码设置。默认的\u external
    或--external encoding或-E

  • 默认内部编码,使用
    编码设置。默认\u internal
    或--internal encoding(或冒号后的-E)

Ruby默认情况下会根据一些相当混乱的规则将字符串设置为内部或外部编码。有关详细信息,请参阅。但这里重要的一点是,当从二进制数据创建字符串时,它似乎是使用的内部编码,而不是外部编码

我的内部编码是nil,所以这并没有发生。(ASCII-8BIT是当Ruby不知道编码是什么时得到的编码——它基本上意味着“这对我来说只是数据,祝你阅读好运”。)

如果我在命令行上传递
--内部编码UTF-8
,问题就会消失。从某种意义上说,这与Jeremy的gem无关

当我把
-E UTF-8
放在命令行上时,它设置了默认的外部编码。在这种情况下,它没有任何作用


编辑:它在这种情况下起作用,但在某些(全部?)情况下,Ruby会将字符串转换为内部编码,而不是像在
force\u encoding
中那样只设置编码值。这很难理解。

理解Ruby中编码的多个设置是关键。有:

  • 使用magic注释或-k命令行开关设置的区域设置编码

  • 默认的外部编码,设置为wi