我有一个免费的Android应用程序,已超出原始的预期用户群。我遇到了一个实例,其中这种String.format生成了一个无效的SQL字符串:
String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id);
肯定会导致问题的一种情况是用户的本地化是针对阿拉伯语的,因此客户ID以阿拉伯字符表示。
我解决了这个特殊的问题:
String sql = String.format (Locale.ENGLISH, "SELECT name from customers where cust_id=%d", cust_id);
延迟找到解决方案的原因是,因为它是免费的应用程序,大多数人都没有报告问题 - 他们只是停止使用应用程序:我只能从崩溃日志中找到答案。此外,本地化的本质似乎取决于所选语言和Android的版本......并且应用程序一直支持V2.1。我已经检测到两种不同类型的阿拉伯语,另一种(我没有识别语言)将数字本地化为问号。
我的问题是使用串联生成sql查询的语句是否会出现类似的问题,如下所示:
String sql = "SELECT name from customers where cust_id=" + cust_id;
我的大多数查询都是这样的,所以检查和更改是一项很大的工作。我可以根据经验对当前版本进行测试,但是前一个和未来版本如何呢?
答案 0 :(得分:0)
没有字符串连接不会对本地化进行任何更改,只有字符串格式可以。
答案 1 :(得分:0)
整数不保存任何本地化信息(因为它是原语),问题在于您的String.format调用。
您使用了String.format:
/etc/systemd/logind.conf
Android文档说明了这一点:
String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id);
使用指定的格式字符串和参数返回格式化字符串。 始终使用的语言环境是
String format (String format, Object... args)
返回的语言环境。
指定no locale将始终导致字符串的本地化为默认值(在客户的情况下,这是阿拉伯语)。 根据Android文档,还有第二个采用语言环境的方法声明:
Locale.getDefault()
使用指定的语言环境,格式字符串和参数返回格式化字符串。
[...] 如果l为null,则不应用本地化。
所以你的解决方案是修改你的电话:
String format (Locale l, String format, Object... args)
当然,您也可以将调用更改为简单的字符串连接(这可能是SQL查询的首选方式):
String sql = String.format (null, "SELECT name from customers where cust_id=%d", cust_id);
来源:https://developer.android.com/reference/java/lang/String.html