如何解决Expect脚本非拉丁字符输出问题?CP866编码西里尔文异常
解决QNX 6下Shell内嵌Expect脚本输出西里尔文(CP866编码)乱码问题
问题背景
- 运行环境:QNX 6 操作系统,系统编码为CP866
- 工具版本:Expect 5.33,Tcl 8.3.5
- 核心问题:编写Telnet连接测试脚本时,拉丁字符输出正常,但西里尔文显示为问号;纯Expect脚本(.exp后缀文件)保存为CP866编码即可正常输出西里尔文,但Shell内嵌Expect脚本无法通过该方式解决。
可行解决方案
方法1:在Expect代码块中强制指定编码
在Shell内嵌的Expect代码里,通过Tcl的fconfigure命令强制将标准输入、输出、错误流的编码设置为CP866:
#!/bin/sh expect << 'EOF' # 强制绑定编码为CP866 fconfigure stdin -encoding cp866 fconfigure stdout -encoding cp866 fconfigure stderr -encoding cp866 # 示例Telnet测试逻辑 spawn telnet your_target_host expect "login:" send "your_username\r" expect "password:" send "your_password\r" expect "$ " send "echo Привет мир\r" expect eof EOF
注意:必须使用
<< 'EOF'作为分界符,防止Shell解析Expect脚本中的特殊字符或变量。
方法2:将内嵌代码转为CP866编码的临时文件执行
如果方法1无效,可先将内嵌的Expect代码写入临时文件,转换为CP866编码后再执行:
#!/bin/sh # 生成临时Expect脚本 cat > /tmp/telnet_test.exp << 'EOF' spawn telnet your_target_host expect "login:" send "your_username\r" expect "password:" send "your_password\r" expect "$ " send "echo Привет мир\r" expect eof EOF # 转换编码为CP866(若原脚本为UTF-8编码) iconv -f utf-8 -t cp866 /tmp/telnet_test.exp > /tmp/telnet_test_cp866.exp # 执行转换后的脚本 expect /tmp/telnet_test_cp866.exp # 清理临时文件 rm -f /tmp/telnet_test.exp /tmp/telnet_test_cp866.exp
若脚本直接在QNX环境编写并保存为CP866编码,可跳过
iconv转换步骤。
方法3:设置终端locale环境变量
执行脚本前,先设置终端的locale为CP866对应的俄语区域:
export LC_ALL=ru_RU.CP866 export LANG=ru_RU.CP866 # 执行你的Shell内嵌Expect脚本 ./your_telnet_script.sh
需确保QNX系统已预装
ru_RU.CP866locale,若未安装需先通过系统包管理添加。
内容的提问来源于stack exchange,提问作者Shirley_
相关产品推荐
相关产品推荐

