如何使用 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 模板正确显示西班牙语字符? 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 是什么决定了从 lambda 创建哪个函数式接口?

    请考虑这个例子 import java util function Consumer public class Example public static void main String args Example example new
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 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 将被处理为消息资源的源 这正如我所期望的那样 但字符 无法正确显示 我的消息属性