Bash中使用iconv转换希伯来语键盘布局时遇非法输入序列错误
解决Bash脚本中希伯来语键盘布局转换的
iconv错误 错误原因分析
- HTML实体残留:脚本中的
<(对应<)、&(对应&)是HTML转义字符,不是实际Shell可识别的字符,导致tr的字符集参数无效。 tr不支持多字节字符:UTF-8编码的希伯来语字符是多字节的,而tr仅能处理单字节字符,直接传入会导致字符拆分混乱,触发iconv的非法序列错误。- 转义序列错误:脚本中
\ק这类写法会让Shell将反斜杠视为转义符,导致实际输出的字符与预期不符。
解决方案
改用支持多字节字符的awk工具替代tr,同时清理HTML实体,明确键位映射关系:
#!/bin/bash # 确保locale为UTF-8,支持多字节字符处理 export LC_ALL=en_US.UTF-8 read -p "Give me a word: " word # 定义英文键 -> 希伯来语字符的映射(含大小写及符号) declare -A en_to_he=( [q]='ק' [w]='ר' [e]='א' [r]='ט' [t]='ו' [y]='ן' [u]='ם' [i]='פ' [o]=']' [p]='[' ['[']='ך' [']']='ש' [a]='ד' [s]='ג' [d]='כ' [f]='ע' [g]='י' [h]='ח' [j]='ל' [k]='ך' [l]='ף' [';']=',' ["'"]='.' ['\\']='/' [z]='ז' [x]='ס' [c]='ב' [v]='ה' [b]='נ' [n]='מ' [m]='צ' [',']='ת' ['.']='ץ' ['/']="''" [Q]='ק' [W]='ר' [E]='א' [R]='ט' [T]='ו' [Y]='ן' [U]='ם' [I]='פ' [O]='}' [P]='{' ['{']='ך' ['}']='ש' [A]='ד' [S]='ג' [D]='כ' [F]='ע' [G]='י' [H]='ח' [J]='ל' [K]='ך' [L]='ף' [':']='"' ['"']="''" ['|']='\\' [Z]='ז' [X]='ס' [C]='ב' [V]='ה' [B]='נ' [N]='מ' [M]='צ' ['>']='ץ' ['<']='ת' ['?']='/' [@]='@' [#]='#' [$]='$' [^]='^' ['&']='&' [~]='~' ['`']='`' ) # 定义希伯来语字符 -> 英文键的映射 declare -A he_to_en for en in "${!en_to_he[@]}"; do he="${en_to_he[$en]}" he_to_en["$he"]="$en" done # 英文键转希伯来语 echo -n "English to Hebrew: " echo "$word" | awk -v map="${en_to_he[*]}" ' BEGIN { split(map, arr, " "); for (i=1; i<length(arr); i+=2) { trans[arr[i]] = arr[i+1]; } } { res = ""; for (i=1; i<=length($0); i++) { c = substr($0, i, 1); res = res (trans[c] ? trans[c] : c); } print res; }' # 希伯来语转英文键 echo -n "Hebrew to English: " echo "$word" | awk -v map="${he_to_en[*]}" ' BEGIN { split(map, arr, " "); for (i=1; i<length(arr); i+=2) { trans[arr[i]] = arr[i+1]; } } { res = ""; for (i=1; i<=length($0); i++) { c = substr($0, i, 1); res = res (trans[c] ? trans[c] : c); } print res; }'
使用说明
- 脚本首先设置
LC_ALL为UTF-8,确保系统能正确处理多字节的希伯来语字符。 - 用关联数组定义清晰的键位映射关系,彻底规避
tr的单字节限制问题。 - 通过
awk遍历输入字符串的每个字符,根据映射表进行精准替换,完美支持多字节字符处理。
内容的提问来源于stack exchange,提问作者aviv levari
相关产品推荐
相关产品推荐

