Tomcat10.1.x发布,告别中文乱码

Tomcat的早期版本由于使用西欧字符集导致中文乱码问题,使得亚洲开发者在处理编码时面临挑战。虽然在9.0.14版本中有所改进,但在某些场景下仍会出现编码错误,如默认错误页面的显示。Tomcat10.1.x得益于Java 11的改进,默认将转换为UTF-8,解决了这个问题。

大多数亚洲的开发者,例如中国、俄罗斯、日本、韩国,我们使用Apache Tomcat时遇到的第一个问题,通常就是乱码,无论是在Windows还是Linux,无论是Console中的Log还是Browser中的JSP,都存在编码错误的问题。Tomcat让我们亚洲开发人员认识了一种在其他平台闻所未闻的特殊编码,名为"ISO 8859-1"的西欧语字符集,西欧语不适用于亚洲开发人员,通常都要对其进行一些设置,例如server.xml中设置URIEncoding属性,Servlet中设置setCharacterEncoding,在logging.properties中设置java.util.logging.ConsoleHandler.encoding,这些四处杂乱无章的设置令人困扰。其实这是一个古老的问题,从Tomcat十多年前创建之初就是如此,经常是Tomcat对国际化的支持有问题吗?

确实如此,Tomcat一直到2018年11月16日才在9.0.14版本中进行了中文以及其他流行语言的支持,制作了数个LocalStrings_zh_CN.properties文件commit↑,假如你用的Tomcat8以及以下版本,那Tomcat他就是不支持中文的。但我们其实不需要其对中文的支持,只需要他依照正常的情况去处理中文字符,这就足够了,但Tomcat却没能把这一点做好,还产生了很多疑问:

  1. 为什么Tomcat要使用奇怪的"ISO 8859-1"西欧语字符集?
    最初这是Tomcat开发者们的原因,开发者们都来自西欧,自然使用西欧字符集,那时候UTF-8并不普遍。也有Java的原因,Tomcat由于开发时间非常的早,酷爱原生的Java包,其中就包括一个万恶之源java.util.ResourceBundle,它是一个用作国际化处理的包,但问题就在于这个国际化包,竟将所有的字符都转为ISO-8859-1,一直到Java9才改正这个可怕的错误。所幸的是由于ResourceBundle的接口设计也非常糟糕,很少有开发人员使用它;不幸的是Tomcat在项目之初就使用了ResourceBundle,至今仍在大量使用,埋下了编码错误的祸根。

  2. 如何找到ResourceBundle的错误
    只需要一份中文的demo_zh_CN.properties文件正常使用即可

#demo_zh_CN.properties
text=中文
//Main.java
ResourceBundle bnd = ResourceBundle.getBundle("demo", Locale.CHINA);
System.out.println(bnd.getString("text"));

输出为

中文

这段ISO-8859-1编码转换一下即可正常显示,只需要:

System.out.println(new String(bnd.getString("text").getBytes(Charset.forName("ISO-8859-1")), Charset.defaultCharset()));
中文

但每次取值都进行这样的转换是无法接受的

  1. 如今在Tomcat9已经出现了一种配置无法改变的编码错误,就是在浏览器上包含状态码的默认报错页,例如最常见的400、404、500,依照上文的设置方式都没有任何的作用,这是为什么?

只能通过Chrome的语言设置项将英文设置为优先解决此问题,或者在页面上也尝试使用ISO 8859-1编码,或者自己编写错误页以替代Tomcat。如果Chrome语言设置中文优先,首先Tomcat根据Accept-Language取出浏览器请求的语言,然后使用ResourceBundle寻找中文配置项,读取到LocalStrings_zh_CN.propertiesResourceBundle就已经将其转为"ISO 8859-1",Tomcat并没有像上面那样进行编码转换,生成错误页时取出错误文本的代码在ErrorReportValve.java#L222,Tomcat对ResourceBundle进行了封装,获取bundle值的代码在StringManager.java#L133,整个错误页拼接过程几乎都不受到任何字符集配置,参数的影响,所以只能修改Tomcat源码重新编译以解决。

  1. Tomcat10.1.x修正了此bug吗?

没有,但是Java修复了此bug,Java9中ResourceBundle会默认转换为UTF-8,Tomcat10.1.x使用了Java 11,而Tomcat10.0仍然使用Java 8,所以Tomcat10.1.x不再存在这个问题,感谢Oracle终于发现并修复了这个问题:

https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm#JSINT-GUID-5ED91AA9-B2E3-4E05-8E99-6A009D2B36AF

<think>好的,用户现在询问如何安装Tomcat 10.1.x或者获取下载地址。首先,我需要回顾之前的对话历史,看看用户之前提到过什么问题。之前用户问的是Tomcat7.0.79是否适配JDK23,我回答不兼容,并建议升级到Tomcat 10.1.x或者降级JDK。现在用户引用了几个关于Tomcat 10.1.x的引用,特别是关于JSTL配置和下载地址的内容,但用户现在明确表示需要安装方法或下载地址。 首先,我需要确认用户的需求。用户可能正在尝试升级他们的Tomcat版本以兼容更新的JDK,或者他们可能在开发过程中遇到了问题,比如JSTL配置错误,现在需要正确安装Tomcat 10.1.x。用户引用的内容中提到在Tomcat官网下载,但用户可能对具体的步骤不太清楚,或者需要更详细的指导。 接下来,我需要参考用户提供的引用内容。引用[2]提到了Tomcat官网的下载页面,并具体提到了apache-tomcat-10.1.33 windows-x64版本,还提到可以到用户主页的资源中下载Tomcat-8.5.85,但用户现在需要的是Tomcat 10.1.x,所以重点应该放在官方下载渠道。引用[1]和[3]涉及JSTL的配置和Java版本的问题,但用户当前的问题是关于安装和下载,可能需要简要提及这些相关配置,但主要回答应集中在安装步骤。 然后,我需要确保回答的结构清晰,分步骤说明下载和安装过程。用户可能需要详细的步骤,包括如何访问官网、选择正确版本、下载、解压、配置环境变量以及验证安装是否成功。同时,用户可能遇到的问题,比如选择哪个压缩包(zip vs tar.gz),是否需要配置JAVA_HOME,这些都需要涵盖进去。 另外,用户之前的对话中提到Tomcat 10.1.x使用Java 11,所以在安装步骤中需要提醒用户确保已安装兼容的JDK版本,比如JDK 11或更高,这可能影响到他们是否能成功运行Tomcat。此外,用户之前的问题涉及JSTL配置错误,所以在安装Tomcat后,可能需要指导如何正确配置JSTL,但用户现在的问题主要是安装,所以这部分可以作为附加提示,而不是主要内容。 需要注意用户的引用中提到Tomcat 10.1.x解决了Java 9中的ResourceBundle问题,所以在回答中可以提到升级Tomcat 10.1.x的好处,比如修复了某些bug,但不要偏离用户当前的问题。同时,用户可能对下载地址有疑问,特别是官网上的不同版本和文件类型,需要明确说明如何选择正确的文件。 最后,生成的相关问题需要与安装、配置和升级相关,比如如何验证安装是否成功,或者如何解决常见启动问题,这些都能帮助用户进一步操作。同时,要确保所有引用标注正确,根据用户提供的引用[1]、[2]、[3]来支持回答中的内容,比如下载地址来自引用[2],Java版本要求来自引用[3]。</think>根据引用内容和官方文档,以下是**Tomcat 10.1.x 的安装方法及下载地址**的详细步骤: --- ### **一、下载 Tomcat 10.1.x** 1. **访问官方下载页面** 通过 Apache Tomcat 官网获取:[Apache Tomcat 10.1.x 下载地址](https://tomcat.apache.org/download-10.cgi) [^2] - 选择对应操作系统的压缩包: - Windows:`zip`(如`apache-tomcat-10.1.33-windows-x64.zip`) - Linux/macOS:`tar.gz`(如`apache-tomcat-10.1.33.tar.gz`) 2. **镜像加速(可选)** 若官网下载缓慢,可使用国内镜像站点(如华为云镜像)加速下载。 --- ### **二、安装步骤** #### **Windows 系统** 1. **解压文件** 将下载的 `zip` 文件解压到目标目录(如 `C:\apache-tomcat-10.1.33`)。 2. **配置环境变量(可选)** - 设置 `CATALINA_HOME` 指向 Tomcat 根目录: ```bash CATALINA_HOME=C:\apache-tomcat-10.1.33 ``` - 添加 `%CATALINA_HOME%\bin` 到 `Path` 变量。 3. **验证 Java 版本** Tomcat 10.1.x 要求 **JDK 11 或更高版本**[^3]: ```bash java -version ``` #### **Linux/macOS 系统** ```bash # 解压文件 tar -xzvf apache-tomcat-10.1.33.tar.gz cd apache-tomcat-10.1.33 # 设置权限 chmod +x bin/*.sh # 启动 Tomcat ./bin/startup.sh ``` --- ### **三、验证安装** 1. **访问默认页面** 浏览器打开 `http://localhost:8080`,若显示 **Apache Tomcat 欢迎页面**,则安装成功。 2. **检查日志** 查看日志文件确认无报错: ```bash tail -f logs/catalina.out # Linux/macOS type logs\catalina.out # Windows ``` --- ### **四、附加配置(JSTL 支持)** 若需使用 JSTL(如解决 `forEach` 标红问题),需手动添加依赖: 1. 下载 `jakarta.servlet.jsp.jstl-api-3.0.0.jar` 和 `jakarta.servlet.jsp.jstl-3.0.0.jar` 2. 将 JAR 文件放入 `WEB-INF/lib` 目录[^1] --- ### **常见问题** - **启动失败**:检查 `JAVA_HOME` 是否指向 JDK 11+ - **端口冲突**:修改 `conf/server.xml` 中的 `<Connector port="8080">` - **权限问题**(Linux):使用 `chmod +x bin/*.sh` 赋予执行权限 --- **--相关问题--** 1. Tomcat 10.1.x 如何配置 HTTPS 证书? 2. 如何将 Tomcat 设置为系统服务(Windows/Linux)? 3. Tomcat 10.1.x 与 Spring Boot 3.x 的兼容性如何? [^1]: JSTL 配置需适配 Jakarta EE 命名空间 [^2]: 官方下载地址需核对版本号 [^3]: JDK 版本需严格匹配 Tomcat 要求
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值