Ruby 如何停止Sequel';s postgres pr适配器返回错误编码的数据?
我从适配器中得到了错误的编码,这是Sequel建议的编码之一 我做错什么了吗? 示例代码: 输出: 不用说,我从续集本身得到了同样的结果。我的数据库不是用ASCII编码的,而是UTF8Ruby 如何停止Sequel';s postgres pr适配器返回错误编码的数据?,ruby,postgresql,encoding,sequel,Ruby,Postgresql,Encoding,Sequel,我从适配器中得到了错误的编码,这是Sequel建议的编码之一 我做错什么了吗? 示例代码: 输出: 不用说,我从续集本身得到了同样的结果。我的数据库不是用ASCII编码的,而是UTF8 现在我需要使用Ruby和JRuby与PostgreSQL交谈,在每种情况下尝试使用相同的工具链是有意义的,因此这是显而易见的适配器。但是 杰里米·福克斯的行为也一样 我可以通过全面强制编码来解决这个问题,但这将是我所有代码中最痛苦的事情 我可能应该提供一些额外的答案(谢谢): 版本->Centos 7;R
- 现在我需要使用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命令行开关设置的区域设置编码
- 默认的外部编码,使用
或--external encoding或-E编码设置。默认的\u external
- 默认内部编码,使用
或--internal encoding(或冒号后的-E)编码设置。默认\u internal
--内部编码UTF-8
,问题就会消失。从某种意义上说,这与Jeremy的gem无关
当我把-E UTF-8
放在命令行上时,它设置了默认的外部编码。在这种情况下,它没有任何作用
编辑:它在这种情况下起作用,但在某些(全部?)情况下,Ruby会将字符串转换为内部编码,而不是像在
force\u encoding
中那样只设置编码值。这很难理解。理解Ruby中编码的多个设置是关键。有:
- 使用magic注释或-k命令行开关设置的区域设置编码
- 默认的外部编码,设置为wi