如何使用 Velocity 模板正确显示西班牙语字符?

2024-03-16

我正在使用 Velocity 和消息资源包来生成 html 页面。当我指定墨西哥作为我的区域设置时,我的 messages-es_MX.properties 将被处理为消息资源的源。这正如我所期望的那样。但字符 (áéíóúüñ¿¡) 无法正确显示。

我的消息属性:

customer.greeting=áéíóúüñ¿¡

对于我的第一次尝试,我有以下内容:

  • 生成页面中的 html 标头:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  • velocity properties contains:
    • 输入.encoding=utf-8
    • 输出.encoding=utf-8
  • html文件编码:UTF-8
  • messages_es_MX.properties 编码:ISO-8859-1

输出为 html${customer.greeting}:

�������

然后我意识到属性文件的编码不正确;它也应该是UTF-8。

第二次尝试:

  • html header in the generated page: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    • velocity properties contains:
      • 输入.encoding=utf-8
      • 输出.encoding=utf-8
  • html文件编码:UTF-8
  • messages_es_MX.properties 编码:UTF-8

输出到html:

áéíóúüñ¿¡

关于如何让它发挥作用有什么建议吗?


好吧,事实证明这比我想象的要棘手,但解决方案如下。开始之前,请确保所有 html 和属性文件均采用 UTF-8 编码。所有 Velocity 配置也引用 UTF-8。不应引用 ISO-8859-1。

根本问题是默认情况下,ResourceBundle假设属性文件位于ISO-8859-1编码。可以覆盖它,但需要一段自定义代码。

而不是打电话

ResourceBundle bundle = ResourceBundle.getBundle("messages", MEXICO);

我需要为自定义 Control 实现添加一个参数:

ResourceBundle bundle = ResourceBundle.getBundle("messages", MEXICO, new UTF8Control());

UTF8Control 类如下所示:

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.ResourceBundle.Control;

public class UTF8Control extends Control {

    public ResourceBundle newBundle(String baseName, Locale locale,
            String format, ClassLoader loader, boolean reload)
            throws IllegalAccessException, InstantiationException, IOException {

        // The below is a copy of the default implementation.
        String bundleName = toBundleName(baseName, locale);
        String resourceName = toResourceName(bundleName, "properties");
        ResourceBundle bundle = null;
        InputStream stream = null;
        if (reload) {
            URL url = loader.getResource(resourceName);
            if (url != null) {
                URLConnection connection = url.openConnection();
                if (connection != null) {
                    connection.setUseCaches(false);
                    stream = connection.getInputStream();
                }
            }
        } else {
            stream = loader.getResourceAsStream(resourceName);
        }
        if (stream != null) {
            try {
                // Only this line is changed to make it to read properties files
                // as UTF-8.
                bundle = new PropertyResourceBundle(new InputStreamReader(
                        stream, "UTF-8"));
            } finally {
                stream.close();
            }
        }
        return bundle;
    }

}

感谢最初发布的@BalusC这个相关答案 https://stackoverflow.com/questions/4659929/how-to-use-utf-8-in-resource-properties-with-resourcebundle.

所以,第 1 部分解决了。但仍然有一个问题,因为我正在使用 VelocityTools,我可以在源代码中看到ResourceTool它称之为ResourceBundle.getBundle(...)无需传入任何 Control 实现。这意味着它将使用 ISO-8859-1,而我无法传递我的 UTF8Control...

除非我重写 ResourceTool 类的方法来获取包:

package test;

import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.velocity.tools.ConversionUtils;
import org.apache.velocity.tools.generic.ResourceTool;

public class UTF8ResourceTool extends ResourceTool {

    /**
     * Retrieves the {@link ResourceBundle} for the specified baseName and
     * locale, if such exists, using UTF-8 encoding. If the baseName or locale is null or if the
     * locale argument cannot be converted to a {@link Locale}, then this will
     * return null.
     */
    protected ResourceBundle getBundle(String baseName, Object loc) {
        Locale locale = (loc == null) ? getLocale() : toLocale(loc);
        if (baseName == null || locale == null) {
            return null;
        }
        return ResourceBundle.getBundle(baseName, locale, new UTF8Control());
    }

    /* Copied here from parent class because it's private there */
    private Locale toLocale(Object obj) {
        if (obj == null) {
            return null;
        }
        if (obj instanceof Locale) {
            return (Locale) obj;
        }
        String s = String.valueOf(obj);
        return ConversionUtils.toLocale(s);
    }

}

在我的 UTF8ResourceTool 类中,我仅重写一种方法getBundle(而且我必须从父类中逐字复制私有方法)。重写的方法在获取资源包时将 UTFControl 作为第三个参数传递,以便我们可以使用 UTF-8 编码提取资源。

现在剩下的唯一一件事就是更新我的 Velocity 配置,以便我引用我的自定义UTF8ResourceTool而不是速度工具'ResourceTool:

        EasyFactoryConfiguration config = new EasyFactoryConfiguration();
    config.toolbox(Scope.APPLICATION).tool("msg", UTF8ResourceTool.class)
            .property("bundles", "messages/messages").property("locale", locale)
            .tool("date", DateTool.class).tool("number", NumberTool.class)
            .tool("string", StringTool.class).tool("esc", EscapeTool.class)
            .tool("base64", Base64Tool.class);

把它们放在一起,我的 html 输出为${customer.greeting} is:

áéíóúüñ¿¡
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Velocity 模板正确显示西班牙语字符? 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 从 J2SE 5.0 学习 Java SE 6 有多难?

    我是新来的 我有一个简单的问题 希望有人能帮助我 我即将开始学习Java 正在寻找一本好的教材来使用 我发现 Y Daniel Liang 的 Java 编程入门 评价很高 但我想知道是否可以使用旧的第 6 版 2006 年 7 月 22
  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • Java Sound可以用来控制系统音量吗?

    Java 声音优惠FloatControl各种声音线路功能的实例 以及MASTER GAIN http docs oracle com javase 7 docs api javax sound sampled FloatControl T
  • IDEA:javac:源版本1.7需要目标版本1.7

    使用 IntelliJ IDEA 运行 JUnit 测试时 我得到 我该如何纠正这个问题 使用SDK 1 7 模块语言级别为1 7 Maven 构建工作正常 这就是为什么我相信IDEA配置问题 您很可能在此处从 Maven 导入了不正确的编
  • 注释处理器可以用于代码生成吗?

    假设我定义了一个名为 MyAnnotation 有一个班级X其声明为 MyAnnotation class X 现在在编译时我想检查所有带有注释的类 MyAnnotation并对更多需要在同一进程中编译的 java 源文件进行一些代码生成
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • Spring Security登录返回404

    我目前正在使用 Spring 框架开发我的博客 我正在实现 Spring Security 用于登录目的 一切都按预期进行 直到我提交始终返回 404 代码的登录凭据 这是我的 web xml 代码e
  • 获取 n 元组中的所有 1-k 元组

    当 n 5 且 k 3 时 以下循环将执行此操作 List
  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 未找到 GroovyEvaluator

    我会尝试在以下位置制作我的 PIE 3D 报告iReport 在我的 struts xml 中 我用这个来调用我的报告
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕

随机推荐

  • Python tkinter 通过单选按钮输入小部件状态切换

    一个简单的问题 对于像我这样的 tkinter 新手来说不是那么简单 我正在构建一个 GUI 我想要有两个单选按钮来驱动 Entry 小部件的状态 启用或禁用 用户将在其中输入数据 当按下第一个单选按钮时 我希望禁用该条目 当按下第二个单选
  • 春季侦探行李传播未传播/工作

    我们当前使用的是 sleuth 2 2 3 RELEASE 我们看不到 http 标头中传递的 userId 字段没有传播 下面是我们的代码 BaggageField REQUEST ID BaggageField create x vca
  • 找不到 ProfileCommon

    我在我的代码中收到错误 ProfileCommon 无法找到 我不知道如何修复该错误 我使用 system Web Profile 放置命名空间 但这里仍然出现错误 有人可以帮忙怎么做吗 如果您知道请帮助我 谢谢 public partia
  • CSS Flexbox - 根据屏幕尺寸组织弹性项目

    我有一个弹性项目容器 我试图根据屏幕尺寸以不同的布局组织不同数量的弹性项目 例如 在桌面上 我想要有 4 个容器 每个容器有 2 个项目 布局在 2x4 网格中 每个单元格为 1x2 我似乎无法理解的是纯粹使用 Flexbox 在平板电脑上
  • gnuplot:在 y 轴上绘制 4 列的文件

    我有一个包含 4 个数字 最小值 最大值 平均值 标准差 的文件 我想用 gnuplot 绘制它 Sample 24 31 29 0909 2 57451 12 31 27 2727 5 24129 14 31 26 1818 5 0419
  • Python 多重处理是否从父级复制所有模块?

    我注意到我可以访问子进程中位于子进程函数 目标之外的函数和模块 所以我想知道当我在 python 中创建子进程时它是否会复制当前进程中的所有内容 为什么我可以访问子目标之外的函数和导入的模块 from multiprocessing imp
  • 测试时如何访问request.user?

    我刚刚从 Django 1 3 1 迁移到 Django 1 4 这样做之后 我的大量测试开始出现这些错误 Traceback most recent call last File Volumes Data ADay Website Bac
  • 为什么使用 Spark Direct Stream 从 kafka 接收的元组的第一个成员为 null

    当使用KafkaUtils createDirectStream从kafka读取消息时 Tuple2的v1 1成员为null KafkaUtils createDirectStream streamingContext String cla
  • 在 Vim 中滚动长换行

    Problem 在写散文时 使用时滚动会以意想不到的方式工作j向下滚动 当我在文本的两个长段落 vim 中的换行 之间滚动时 使用j 当到达下一个长段落 行 时 文本从屏幕底部 跳 到顶部 将段落 行 的第一个单词与屏幕顶部对齐 参见下面的
  • 使用 dojo 修改 div 的文本

    我有一个 dojo 小部件 对于小部件 我有 2 个文件 A js 和 A html 现在在 A html 中我有类似的东西 div div 上面的行是小部件模板中的一行 它是一个普通的 html div 现在在A js中我对服务器进行异步
  • 如何从 VS2015 瞄准 Mono 框架?

    我想在安装了 mono 的 Linux 上部署 ASP NET Web 应用程序 据我所知 Mono 是一个类似于 DNX 4 5 1 或 DNX Core 5 0 的目标平台 因此 我需要以某种方式将其添加到我的项目中的目标平台 以针对它
  • 如何在 Scala 中添加对 Future 的回调?

    我看到一个例子here http docs scala lang org overviews core futures html val fut Future my body function my body function starts
  • Xcode 日志“编写分析变体”

    运行 Xcode 13 在模拟器中启动我的 iOS 应用程序时 我看到以下日志 编写分析变体 请注意 这可能是日志的拼写错误 写肛门yzed 变种 是什么导致了这种日志噪音 我的代码中有什么东西触发了它吗 我怎样才能隐藏这个 编写分析变体
  • 未知数量列表的交集c#.net

    我有一个dictionary
  • 如何防止 Event.Resize 在 displayState 更改为 FULL_SCREEN 时触发两次?

    我有一个带有全屏按钮的应用程序 当单击该按钮时 我将舞台的显示状态更改为StageDisplayState FULL SCREEN INTERACTIVE 这使得Event RESIZE发射两次如果stage scaleMode Stage
  • 具有自定义事件的平台的 Web 分析

    我正在建立一个制作网站的平台 将 wordpress com 视为类似的示例 每个站点都将成为我的域的子域 例如 abc mydomain com 或 xyz mydomain com 我对分析有一些要求 但我无法满足所有要求 我希望能够查
  • iPhone 企业分发计划

    我想实现一个应用程序来备份 iPhone 中存储的所有内部数据 如短信 彩信 视频 音频 文档 通话记录 但这对于苹果迄今为止发布的API文档来说似乎是不可能的 我已经浏览了企业分发程序的PDF和一些与企业分发程序相关的链接 指定了有关远程
  • 如何在 WooCommerce 中获取订单 ID?

    如何在 WooCommerce 中检索订单 ID 当前方法 当前实现此目的的方法是使用此函数 order gt get id 这应该返回不带 的订单 ID 旧方法 在旧版本的 WooCommerce 中 您可能需要将其作为属性来访问 ech
  • Python 3 to_bytes 是否已向后移植到 python 2.7?

    这是我想要的功能 http docs python org 3 library stdtypes html int to bytes http docs python org 3 library stdtypes html int to b
  • 如何使用 Velocity 模板正确显示西班牙语字符?

    我正在使用 Velocity 和消息资源包来生成 html 页面 当我指定墨西哥作为我的区域设置时 我的 messages es MX properties 将被处理为消息资源的源 这正如我所期望的那样 但字符 无法正确显示 我的消息属性