背景

项目中使用Spring的ReloadableResourceBundleMessageSource这个类来实现多语言,有一次字符串里包含引号'时,解析时出了问题,一起来看一下吧

例子

resources下包含三个语言文件

分别是:
bundle_zh_CN.properties
hello=你好吗?{0} bundle_zh_TW.properties
hello=你好嗎?{0} bundle_en.properties
hello=how are you ? {0}
测试类:
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(getMessage("hello", new Object[] {"辉"}, Locale.CHINA));
System.out.println(getMessage("hello", new Object[] {"輝"}, Locale.TRADITIONAL_CHINESE));
System.out.println(getMessage("hello", new Object[] {"hui"}, Locale.ENGLISH));
} public static String getMessage(String code, Object[] args, Locale locale) {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasename("bundle");
messageSource.setCacheSeconds(1800);
return messageSource.getMessage(code, args, locale);
}
} 输出:
你好吗?辉
你好嗎?輝
how are you ? hui 可以看出没什么问题

如果含有引号'

改成:
bundle_zh_CN.properties
hello=你好'吗?{0} bundle_zh_TW.properties
hello=你好'嗎?{0} bundle_en.properties
hello=how are' you ? {0}
输出结果:
你好吗?{0}
你好嗎?{0}
how are you ? {0} 可以看出如果含有引号',参数不起作用,而且引号'也没显示出来

原因

MessageFormat messageFormat = resolveCode(code, locale);
if (messageFormat != null) {
synchronized (messageFormat) {
return messageFormat.format(argsToUse);
}
} 追踪源码,底层是由Java底层的MessageFormat来实现的 API中解释如下:
Within a String, a pair of single quotes can be used to quote any arbitrary characters except single quotes.
For example, pattern string "'{0}'" represents string "{0}", not a FormatElement.
A single quote itself must be represented by doubled single quotes '' throughout a String.
For example, pattern string "'{''}'" is interpreted as a sequence of '{ (start of quoting and a left curly brace), '' (a single quote), and }' (a right curly brace and end of quoting), not '{' and '}' (quoted left and right curly braces): representing string "{'}", not "{}". Any unmatched quote is treated as closed at the end of the given pattern. For example, pattern string "'{0}" is treated as pattern "'{0}'". 大概意思就是:
- 两个单引号里面的值保持不变,不会被格式化
- 如果想输出单引号,使用两个单引号'' 来输出单引号'
- 如果只有一个单引号,那么单引号后面的值就原封不动的输出来,即不会被格式化

修改

改成:
bundle_zh_CN.properties
hello=你好''吗?{0} bundle_zh_TW.properties
hello=你好''嗎?{0} bundle_en.properties
hello=how are'' you ? {0} 输出结果:
你好'吗?辉
你好'嗎?輝
how are' you ? hui
还有一点需要注意的就是:在没有参数的情况下,如果想输出引号,那就用一个引号即可,如下:
bundle_zh_CN.properties
hello=你好'吗? bundle_zh_TW.properties
hello=你好'嗎? bundle_en.properties
hello=how are' you ?
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(getMessage("hello", null, Locale.CHINA));
System.out.println(getMessage("hello", null, Locale.TRADITIONAL_CHINESE));
System.out.println(getMessage("hello", null, Locale.ENGLISH));
} 输出:
你好'吗?
你好'嗎?
how are' you ?

当resource bundle 的多语言文件里包含引号'时的更多相关文章

  1. 【转】python删除文件里包含关键词的行

    import shutil with open('/path/to/file', 'r') as f: with open('/path/to/file.new', 'w') as g: for li ...

  2. apk去广告工具(利用apktool去除apk文件里的广告)

    基本知识 apk安装包的文件结构 以知名桌面软件“LauncherPro”为例,apk安装包文件目录: 文件目录如下: - META-INF - res - anim - color - drawab ...

  3. [转]Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

    转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...

  4. C++头文件的包含顺序研究

    一.<Google C++ 编程风格指南>里的观点 公司在推行编码规范,领导提议基本上使用<Google C++ 编程风格指南>.其中<Google C++ 编程风格指南 ...

  5. 转:Windows中的命令行提示符里的Start命令执行路径包含空格时的问题

    转自:http://www.x2009.net/articles/windows-command-line-prompt-start-path-space.html 当使用Windows 中的命令行提 ...

  6. Spring resource bundle多语言,单引号format异常

    Spring resource bundle多语言,单引号format异常 前言 十一假期被通知出现大bug,然后发现是多语言翻译问题.法语中有很多单引号,单引号在format的时候出现无法匹配问题. ...

  7. Windows Store App下代码加载page resource和resw文件里的string

    加载page resource 在page的code behind里: this.Resources["textBoxStyle"] 加载resw文件里的string: Resou ...

  8. C语言学习_C如何在一个文件里调用另一个源文件中的函数

    问题 C如何在一个文件里调用另一个源文件中的函数,如题. 解决办法 当程序大了代码多了之后,想模块化开发,不同文件中存一点,是很好的解决办法,那我们如何做才能让各个文件中的代码协同工作呢?我们知道,m ...

  9. 教你如何在 Javascript 文件里使用 .Net MVC Razor 语法

    摘录 文章主要是介绍了通过一个第三方类库RazorJS,实现Javascript 文件里使用 .Net MVC Razor 语法,很巧妙,推荐给大家 相信大家都试过在一个 View 里嵌套使用 jav ...

  10. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

随机推荐

  1. 002-ImageNetClassificationDeep2017

    ImageNet classification with deep convolutional neural networks #paper 1. paper-info 1.1 Metadata Au ...

  2. 面试突击84:Spring 有几种事务隔离级别?

    Spring 中的事务隔离级别和数据库中的事务隔离级别稍有不同,以 MySQL 为例,MySQL 的 InnoDB 引擎中的事务隔离级别有 4 种,而 Spring 中却包含了 5 种事务隔离级别. ...

  3. Prometheus 监控外部 Kubernetes 集群

    转载自:https://www.qikqiak.com/post/monitor-external-k8s-on-prometheus/ 在实际环境中很多企业是将 Prometheus 单独部署在集群 ...

  4. 实用脚本:检查高 CPU / 内存消耗进程

    1 检查高 CPU 消耗进程在 Linux 上运行了多长时间的 Bash 脚本 该脚本将帮助你确定高 CPU 消耗进程在 Linux 上运行了多长时间. # vi /opt/scripts/long- ...

  5. Django命令

    (venv) E:\Py_CODE\myapp>python manage.py --help Type 'manage.py help <subcommand>' for help ...

  6. 面试突击86:SpringBoot 事务不回滚?怎么解决?

    在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚: 当 @Transactional 遇上 try/catch 事务不自动 ...

  7. ubuntu安装及使用

    ubuntu教程 一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的"ubuntu"一 ...

  8. 备份 MySQL 的 shell 脚本(mysqldump版本) shell脚本

    #!/bin/bash # 备份 MySQL 的 shell 脚本(mysqldump版本) # 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签) # dbn ...

  9. java:找不到符号

    出现这种情况的原因之一:实体类的字段修改过.实体类中的变量名修改.然而其他地方调用的字段名还是修改之前的变量.

  10. HTML+CSS基础知识(5)相对定位、绝对定位、固定定位

    文章目录 1.相对定位 1.1 代码 1.2 测试结果 2.绝对定位 2.1 代码 2.2 测试 3.固定定位 3.1 代码 3.2 测试结果 1.相对定位 1.1 代码 <!DOCTYPE h ...