希伯来文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); } }
代码说明
- 精准分组:通过正则匹配,确保希伯来字符和非希伯来字符(数字、符号等)各自成组,避免拆分错误
- 组顺序反转:反转整个行的组顺序,模拟RTL语言从右到左的排版逻辑
- 希伯来组内部反转:仅对希伯来字符组的内部字符进行反转,保证单个词的正确显示
- 保留非希伯来组原样:数字、符号等非希伯来字符组保持原顺序,不会被错误移动
例如输入“היי 123 מה נשמע!”,处理后会得到“!עמשנ המ 123 ייה”,符合RTL打印的需求。
内容的提问来源于stack exchange,提问作者Gal Cohen
相关产品推荐
相关产品推荐

