关于文本框无法输入非英文字符的现象,在日常国际化测试工作中出现的概率极大。为了限制用户的输入必须符合软件定义的规范,开发人员一般都会对输入框中的value通过正则表达式或事件进行校验。如下图所示,当cost type被设置为“日本语”时,错误框将弹出,操作也无法继续进行。
本例中将以正则表达式作为假定的技术背景,对这一现象进行分析,示例代码如下。
这里我们可以清晰的看到,对该输入框value进行验证的正则表达式被设置为[a-zA-Z0-9],即只允许输入大小写的字母a-z外加数字0-9。然而这一设置显然是国际化软件开发中的兵家大忌,为了修复该问题,我们可以对代码进行如下修改。
这里我们用\S替换掉之前的[a-zA-Z0-9],它可以匹配任何非空白字符,等价于 [^ \f\n\r\t\v]。改动后,本例中的非英文字符无法输入问题得到解决。然而需要注意的是,正则表达式中的pattern取消了之前的严格验证机制,原有问题不再出现,但在其他场景中势必引入新的国际化问题,例如转义字符等,这又是我们需要进一步考虑的。
本例中将以正则表达式作为假定的技术背景,对这一现象进行分析,示例代码如下。
public class CostConfigDTO {
...
@NotNull
@Size(min = 1, max = 255, message = "Size range set to 1-255")
@Pattern(regexp = ".*[a-zA-Z0-9].*", message = "Category types must contain at least one alphanumeric character")
...
}
这里我们可以清晰的看到,对该输入框value进行验证的正则表达式被设置为[a-zA-Z0-9],即只允许输入大小写的字母a-z外加数字0-9。然而这一设置显然是国际化软件开发中的兵家大忌,为了修复该问题,我们可以对代码进行如下修改。
public class CostConfigDTO {
...
@NotNull
@Size(min = 1, max = 255, message = "Size range set to 1-255")
@Pattern(regexp = "^([^\\S+]).*", message = "Category types must not begin with a white space")
...
}
这里我们用\S替换掉之前的[a-zA-Z0-9],它可以匹配任何非空白字符,等价于 [^ \f\n\r\t\v]。改动后,本例中的非英文字符无法输入问题得到解决。然而需要注意的是,正则表达式中的pattern取消了之前的严格验证机制,原有问题不再出现,但在其他场景中势必引入新的国际化问题,例如转义字符等,这又是我们需要进一步考虑的。