String.format与手机设置的语言环境的关系导致语言转换系统无法识别闪退问题

本文主要是介绍String.format与手机设置的语言环境的关系导致语言转换系统无法识别闪退问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题原因:线上闪退日志突然出现同一个用户几千条闪退日志,且都是同一个闪退 no such column: ٥٠٠ (code 1): , while compiling: SELECT type, wid FROM MoPeibo LIMIT ٠,٥٠٠。调查发现٠,٥٠٠是阿拉伯语中的0,500。我们代码是使用String.format来将0和500这两个int类型的值转为string”0,500”。转换代码如下:

String limit = String.format("%d,%d", new Object[]{Integer.valueOf(offset), Integer.valueOf(500)});

也就是说,String.format会考虑本地的语言环境(该问题中,由于手机在设置里面切换语言环境为阿拉伯语,导致上面代码在format的时候将“0,500”转为阿拉伯语“٠,٥٠٠ ”数据库无法识别,结果导致异常):
format(Locale l, String format, Object… args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
format(String format, Object… args) 使用指定的格式字符串和参数返回一个格式化字符串。
后面又测试,发现如下写法不会导致上述问题:

String limit = String.format("%s,%s", String.valueOf(offset), String.valueOf(500));

开始觉得特别奇怪,调用相同的方法为什么有的会根据语言环境转换而有的则不会,查看了源码,发现源码中会对d,s分别处理,除了d和时间类型转换其他的类型都不会进行语言转换。猜想原因是各个国家的数字表示都不同,做了特殊处理。其实到底为啥数字和时间类型要根据语言切换我也不明白,反正源码就是这样写的。以下是源码:

if (token.isDefault()) {switch (token.getConversionType()) {case 's':if (arg == null) {return "null";} else if (!(arg instanceof Formattable)) {return arg.toString();}break;case 'd':boolean needLocalizedDigits = (localeData.zeroDigit != '0');if (out instanceof StringBuilder && !needLocalizedDigits) {if (arg instanceof Integer || arg instanceof Short || arg instanceof Byte) {IntegralToString.appendInt((StringBuilder) out, ((Number) arg).intValue());return null;} else if (arg instanceof Long) {IntegralToString.appendLong((StringBuilder) out, ((Long) arg).longValue());return null;}}if (arg instanceof Integer || arg instanceof Long || arg instanceof Short || arg instanceof Byte) {String result = arg.toString();return needLocalizedDigits ? localizeDigits(result) : result;}}
}

以上只拿出了部分源码,大概都是这个意思,是通过localizeDigits这个方法根据ASCII将数字0-9转为对应语言的字符,如下:

private CharSequence localizeDigits(CharSequence s) {int length = s.length();int offsetToLocalizedDigits = localeData.zeroDigit - '0';StringBuilder result = new StringBuilder(length);for (int i = 0; i < length; ++i) {char ch = s.charAt(i);if (ch >= '0' && ch <= '9') {ch += offsetToLocalizedDigits;}result.append(ch);}return result;
}

总结:在使用String.format以及new SimpleDateFormat(“yyyy-MM-dd”)时候一定要注意处理语言问题,不然很可能引起系统无法识别的错误。处理方式一个是全局指定语音环境,一个是在调用方法时指定语言环境。
全局(自己的Application):

String languageToLoad  = "zh";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = getResources().getConfiguration();
DisplayMetrics metrics = getResources().getDisplayMetrics();
config.locale= Locale.SIMPLIFIED_CHINESE;
getResources().updateConfiguration(config,metrics);

调用方法:

format(Locale l, String format, Object… args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。

这篇关于String.format与手机设置的语言环境的关系导致语言转换系统无法识别闪退问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1071695

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec