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

希伯来文RTL打印无参数,手动反转含符号数字文本异常求助

希伯来文打印反转问题(含符号/数字时失效)

我需要给不支持RTL(从右到左)的打印机发送希伯来文打印指令,因此得手动反转文本。比如“היי מה נשמע”要反转成“עמשנ המ ייה”。目前单独反转纯希伯来文没问题,但文本里混有符号或数字时,反转效果就不对了。

以下是我用的代码:

static byte[] ReverseHebrewWords(string text)
{
    string[] lines = text.Split('\n');

    for (int i = 0; i < lines.Length; i++)
    {
        string[] words = Regex.Split(lines[i], @"\b");
        for (int j = 0; j < words.Length; j++)
        {
            // 检查单词是否包含希伯来字符
            bool hasHebrewCharacters = words[j].Any(c => c >= '\u0590' && c <= '\u05FF');

            if (hasHebrewCharacters)
            {
                words[j] = ReverseHebrewWord(words[j]);
            }
        }

        Array.Reverse(words);
        lines[i] = string.Join("", words);
    }

    string reversedText = string.Join("\n", lines);

    return Encoding.GetEncoding(862).GetBytes(reversedText);

}

static string ReverseHebrewWord(string word)
{
    // 使用LINQ反转希伯来单词
    string reversedWord = new string(word.Where(c => char.GetUnicodeCategory(c) == System.Globalization.UnicodeCategory.OtherLetter).Reverse().ToArray());
    return reversedWord + new string(word.Where(c => !char.IsLetter(c)).ToArray());
}

问题分析

现有代码的核心问题:

  • ReverseHebrewWord方法会把所有非字母字符移到单词末尾,忽略了数字、符号在希伯来文语境中的正确位置(比如数字应和对应希伯来词绑定,而非统一后置)
  • 用\b拆分单词依赖ASCII单词边界规则,对希伯来文这类非ASCII字符的拆分逻辑不准确,容易导致混合字符时拆分错误

修复方案

改用字符组分组处理逻辑:将连续的希伯来字符作为一组,连续的非希伯来字符(数字、符号、空格等)作为另一组,分别处理后重组顺序,确保混合字符的位置正确。

修改后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

public class HebrewPrinterHelper
{
    static byte[] ReverseHebrewText(string text)
    {
        string[] lines = text.Split('\n');
        for (int i = 0; i < lines.Length; i++)
        {
            lines[i] = ProcessLine(lines[i]);
        }
        string reversedText = string.Join("\n", lines);
        return Encoding.GetEncoding(862).GetBytes(reversedText);
    }

    static string ProcessLine(string line)
    {
        // 拆分文本为:连续希伯来字符组 或 连续非希伯来字符组
        var groups = Regex.Matches(line, @"([\u0590-\u05FF]+)|([^\u0590-\u05FF]+)")
                          .Cast<Match>()
                          .Select(m => m.Value)
                          .ToList();

        // 反转整个组的顺序,模拟RTL语言的行排列逻辑
        groups.Reverse();

        // 对每个希伯来字符组单独反转内部字符
        for (int i = 0; i < groups.Count; i++)
        {
            string group = groups[i];
            if (group.Any(c => c >= '\u0590' && c <= '\u05FF'))
            {
                groups[i] = new string(group.Reverse().ToArray());
            }
        }

        return string.Join("", groups);
    }
}

代码说明

  1. 精准分组:通过正则匹配,确保希伯来字符和非希伯来字符(数字、符号等)各自成组,避免拆分错误
  2. 组顺序反转:反转整个行的组顺序,模拟RTL语言从右到左的排版逻辑
  3. 希伯来组内部反转:仅对希伯来字符组的内部字符进行反转,保证单个词的正确显示
  4. 保留非希伯来组原样:数字、符号等非希伯来字符组保持原顺序,不会被错误移动

例如输入“היי 123 מה נשמע!”,处理后会得到“!עמשנ המ 123 ייה”,符合RTL打印的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:53:21