如何不使用Unicode方向格式化代码实现阿拉伯语、英语与数字的双向混排
阿拉伯语、英语、数字混合零额外字符排版问题
需求背景
现有业务要求实现阿拉伯语词汇、英语词汇与数字的混合排版,不得在内容中间插入任何特殊字符。
最初的方案为检测到阿拉伯语文本时使用U+202C(弹出方向格式化代码),但该方案会向文件中注入额外的非打印字符,不符合合规要求:
银行系统协议对文件大小有严格规定,每个位位置对应的字符数量必须完全遵循指定要求,不可出现额外字符。
后续优化方案改为在行首插入一个控制字符,但仍未找到完全不插入任何字符的解决方案,求可行思路。
现有实现代码(Java)
String arabicStr ="المهتار"; String englishStr = "6abc"; System.out.println("Without any special character injected"); System.out.println(arabicStr+englishStr); // Creating array of string length char[] ch = new char[arabicStr.length() + englishStr.length()+1]; // Force following characters to be treated as strong left-to-right characters. ch[0] = '\u202D'; // Copy Arabic character by character into array, in reverse direction int i =0; int j =1; for (i = arabicStr.length()-1; i >=0 ; i--) { ch[j] = arabicStr.charAt(i); j++; } i= arabicStr.length()+1; for(int n =0; n<englishStr.length(); n++ ) { ch[i]=englishStr.charAt(n); i++; } System.out.print("With strict left to right reversed Arabic: "); for (int pos =0; pos< ch.length; pos++ ) { System.out.print(ch[pos]); }
运行输出结果
Without any special character injected المهتار6abc With strict left to right reversed Arabic: راتهملا6abc
实现逻辑说明
当前实现逻辑为:不管文本是阿拉伯语还是英语,全局强制使用从左到右的显示规则,同时将阿拉伯语文本反转。
该混排问题仅出现在阿拉伯语词汇后接字母或数字的场景,根源是双向算法无法判断数字属于阿拉伯语还是英语词汇。
内容的提问来源于stack exchange,提问作者Tirthankar Mitra
相关产品推荐
相关产品推荐

