文本溢出与国际化

来源:互联网 发布:怎么更改淘宝店名 编辑:程序博客网 时间:2024/05/19 02:23

无论是table控件中可调节长度的column,还是tooltip中说明文字,想必大家对text ellipsis(文本溢出)的场景都再熟悉不过。说得再直白些,就是文本显示的部分省略,通过该功能可以有效避免layoutbreak问题。话说这对国际化人开发和测试人员来说应该是个利好啊,这样不就有效避免了各种longstring带来的布局问题么?Absolutely!然而世间事物就是这么奇特,往往兴一利则生一弊……

 

不信?那么就请各位看官上眼,关注Name字段,我们可以清晰的看到一个实心儿的diamondquestion mark,何故?


抢答中——dev肯定没使用UTF-8码表!

 

嗯,非常好!我就欣赏积极参与的!不过……大哥!再看看context吧!笔者开篇就在讲述text ellipsis,合着都白说啦是么?得嘞,不卖关子,让我们直接看dev是如何fix该问题的。关于Name的显示,原本的JS代码为return ToolUtil.ellipsiseText(key, value); 现在修改成了return value; 问题还复现么?自然是不复现啦,您都把ellipsis取消了,还怎么个复现法儿?不过平心而论,该解法相当的凑合,绝对属于用压路机治罗锅的法子,罗锅是治好了,可人没啦……

 

于是乎,我们不禁扪心自问,难道就没有更合适的解决办法么?答案自然是有的,首先让我来帮大家用代码重新下该问题吧。

public class ellipsisTest {                publicstatic void main(String[] args) throws UnsupportedEncodingException {                                Stringstr = "我的textellipsis测试!";                                 for(int i = 0; i < str.getBytes("UTF-8").length-1; i++) {                                                System.out.println("截取"+ (i + 1) + "个字节的结果是"+ cutStringByByte(str, i + 1) + "...");                                }                }                 privatestatic String cutStringByByte(String str, int len) throwsUnsupportedEncodingException {                                byte[]buf = str.getBytes("UTF-8");                                intcount = 0;                                for(int i = len - 1; i >= 0; i--) {                                                if(buf[i] < 0) {                                                                count++;                                                }else {                                                                break;                                                }                                }                                 if(count % 2 == 0) {                                                returnnew String(buf, 0, len, "UTF-8");                                }else {                                                returnnew String(buf, 0, len - 1, "UTF-8");                                }}

截取1个字节的结果是...截取2个字节的结果是�...截取3个字节的结果是�...截取4个字节的结果是我�...截取5个字节的结果是我�...截取6个字节的结果是我的...截取7个字节的结果是我的t...截取8个字节的结果是我的te...截取9个字节的结果是我的tex...截取10个字节的结果是我的text...截取11个字节的结果是我的text...截取12个字节的结果是我的texte...截取13个字节的结果是我的textel...截取14个字节的结果是我的textell...截取15个字节的结果是我的textelli...截取16个字节的结果是我的textellip...截取17个字节的结果是我的textellips...截取18个字节的结果是我的textellipsi...截取19个字节的结果是我的textellipsis...截取20个字节的结果是我的textellipsis...截取21个字节的结果是我的textellipsis�...截取22个字节的结果是我的textellipsis�...截取23个字节的结果是我的textellipsis测�...截取24个字节的结果是我的textellipsis测�...截取25个字节的结果是我的textellipsis测试...截取26个字节的结果是我的textellipsis测试...截取27个字节的结果是我的textellipsis测试�...

到这里,大家可以看到我应该已经完美的模拟了该问题的本质。接下来我将会尝试对其进行fix,修改cutStringByByte方法中关于length的判断。

private static String cutStringByByte(String str, int len)throws UnsupportedEncodingException {                byte[]buf = str.getBytes("UTF-8");                 intcount = 0;                for(int i = len - 1; i >= 0; i--) {                                if(buf[i] < 0) {                                                count++;                                }else {                                                break;                                }                }                 if(count % 3 == 0) {                                returnnew String(buf, 0, len, "UTF-8");                } elseif (count % 3 == 1) {                                returnnew String(buf, 0, len - 1, "UTF-8");                } else{                                returnnew String(buf, 0, len - 2, "UTF-8");                }}
 
截取1个字节的结果是...截取2个字节的结果是...截取3个字节的结果是我...截取4个字节的结果是我...截取5个字节的结果是我...截取6个字节的结果是我的...截取7个字节的结果是我的t...截取8个字节的结果是我的te...截取9个字节的结果是我的tex...截取10个字节的结果是我的text...截取11个字节的结果是我的text...截取12个字节的结果是我的texte...截取13个字节的结果是我的textel...截取14个字节的结果是我的textell...截取15个字节的结果是我的textelli...截取16个字节的结果是我的textellip...截取17个字节的结果是我的textellips...截取18个字节的结果是我的textellipsi...截取19个字节的结果是我的textellipsis...截取20个字节的结果是我的textellipsis...截取21个字节的结果是我的textellipsis...截取22个字节的结果是我的textellipsis测...截取23个字节的结果是我的textellipsis测...截取24个字节的结果是我的textellipsis测...截取25个字节的结果是我的textellipsis测试...截取26个字节的结果是我的textellipsis测试...截取27个字节的结果是我的textellipsis测试...

再次打印,终于看到了期望的无乱码的结果。到这里,个人认为该问题才完美的得到了解决。同时作为一个国际化全栈测试工程师或者国际化测试consultant,也绝对应该有自信和义务去说服dev取代原先简单粗暴的returnvalue; 你们说呢?ヾ(o◕∀◕)ノヾ

1 0
原创粉丝点击