You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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.CP866 locale,若未安装需先通过系统包管理添加。

内容的提问来源于stack exchange,提问作者Shirley_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:07:19