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

Bash中使用iconv转换希伯来语键盘布局时遇非法输入序列错误

解决Bash脚本中希伯来语键盘布局转换的iconv错误

错误原因分析

  1. HTML实体残留:脚本中的&lt;(对应<)、&amp;(对应&)是HTML转义字符,不是实际Shell可识别的字符,导致tr的字符集参数无效。
  2. tr不支持多字节字符:UTF-8编码的希伯来语字符是多字节的,而tr仅能处理单字节字符,直接传入会导致字符拆分混乱,触发iconv的非法序列错误。
  3. 转义序列错误:脚本中\ק这类写法会让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;
}'

使用说明

  1. 脚本首先设置LC_ALL为UTF-8,确保系统能正确处理多字节的希伯来语字符。
  2. 用关联数组定义清晰的键位映射关系,彻底规避tr的单字节限制问题。
  3. 通过awk遍历输入字符串的每个字符,根据映射表进行精准替换,完美支持多字节字符处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:45:04