Ruby在cmd下中文显示乱码以及不支持OpenSSL的问题解决
Windowscmd下Ruby中文乱码源于代码页与UTF-8不匹配,可通过chcp936及脚本添加#encoding:UTF-8解决,输出端建议使用支持UTF-8的终端。OpenSSL支持缺失需手动编译扩展,编译OpenSSL时应添加-fPIC参数,否则链接会因静态库缺少位置无关代码而失败。
在 Windows 的 cmd 环境下跑 Ruby,最让人头疼的莫过于中文乱码和 OpenSSL 支持缺失。这两个问题看似独立,却常常结伴出现,让不少开发者卡在入门阶段。今天我们就来逐一拆解,把解决方案讲透。
中文乱码的根源与应对
cmd 默认的代码页通常是 936(简体中文),但 Ruby 脚本往往以 UTF-8 编码保存。这就导致了读取、输出时的字符集错乱。最简单的第一步,是将 cmd 代码页切换为 936:
chcp 936
接下来,强制 Ruby 以 UTF-8 格式读取脚本文件。在文件开头加上注释即可:
# encoding: UTF-8
这样一来,Ruby 就会用 UTF-8 编码载入文件,避免读取阶段的中文乱码。
但到了输出环节,问题依然顽固——cmd 窗口的编码与 UTF-8 不兼容,直接 puts 中文还是会变成一堆乱码。早期有开发者通过第三方库 iconv 做编码转换来解决:
require 'iconv'
cov = Iconv.new('gbk', 'utf-8')
puts cov.iconv("北京奥运会!")
这种做法虽然可行,但依赖外部库,且在现代 Ruby 版本中已被废弃。更推荐的做法是:**不要在 Ruby 程序内部硬编码中文**,注释除外。如果你的确需要显示中文,可以考虑将输出重定向到文件,或者使用支持 UTF-8 的终端(如 PowerShell、Windows Terminal 配合 UTF-8 代码页)。
Ruby 不支持 OpenSSL 的解决之路
另一类常见问题发生在安装 Rails 或需要 SSL 加密的场景。例如在 RHEL 5.4 x86_64 上安装 Rails 时,系统会提示 Ruby 不支持 OpenSSL。此时需要手动编译 OpenSSL 扩展。
进入 Ruby 源码目录下的 ext/openssl,执行 ruby extconf.rb 检查依赖。如果出现以下错误:
checking for openssl/ssl.h... no Makefile wasn't created. Fix the errors above.
这说明系统没有安装 OpenSSL 开发头文件。从 openssl.org 下载 openssl-0.9.8k.tar.gz,解压后编译安装:
./configure && make && make install
然后重新运行 extconf.rb,并显式指定 OpenSSL 的 include 和 lib 路径:
ruby extconf.rb --with-openssl-include=/usr/local/ssl/include/ --with-openssl-lib=/usr/local/ssl/lib
此时配置阶段通过,但 make 时又可能遇到另一个经典错误:
/usr/bin/ld: /usr/local/ssl/lib/libssl.a: relocation R_X86_64_32 against `a local symbol' cannot be used when making a shared object; recompile with -fPIC
这个错误很明确——静态库 libssl.a 在编译时没有启用位置无关代码(-fPIC),导致无法被动态链接。解决方法是重新编译 OpenSSL,加上 -fPIC 参数:
./configure -fPIC make make install
之后再回到 ext/openssl 目录重新执行 ruby extconf.rb 和 make,应该就能顺利编译出 openssl.so 扩展了。

以上两个问题,本质上都是环境配置的兼容性陷阱。只要掌握了编码转换的机制,以及 OpenSSL 编译时的 -fPIC 细节,就能轻松绕过。技术在迭代,类似 iconv 的老办法虽然能用,但更推荐拥抱现代终端和标准的 UTF-8 工作流。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















