- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 Java 的相等性检查(直接或间接)时,我遇到了德语“Umlaute”(ä、ö、ü、ß)的奇怪行为。从 Eclipse 运行、调试或测试时,一切都按预期工作,包含“Umlaute”的输入被视为等于或不按预期处理。
但是,当我使用 Spring Boot 构建应用程序并运行它时,这些相等性检查对于包含“Umlaute”的词会失败,即对于像“Nationalität”这样的词。
通过 Jsoup 从网页中检索输入,并为某些关键字提取表格内容。页面的编码是 UTF-8,如果不是这种情况,我已经为 Jsoup 进行了转换。源文件的编码也是UTF-8。
Connection connection = Jsoup.connect(url)
.header("accept-language", "de-de, de, en")
.userAgent("Mozilla/5.0")
.timeout(10000)
.method(Method.GET);
Response response = connection.execute();
if(logger.isDebugEnabled())
logger.debug("Encoding of response: " +response.charset());
Document doc;
if(response.charset().equalsIgnoreCase("UTF-8"))
{
logger.debug("Response has expected charset");
doc = Jsoup.parse(response.body(), baseURL);
}
else
{
logger.debug("Response doesn't have exepcted charset and is converted");
doc = Jsoup.parse(new String(response.bodyAsBytes(), "UTF-8"), baseURL);
}
logger.debug("Encoding of document: " +doc.charset());
if(!doc.charset().equals(Charset.forName("UTF-8")))
{
logger.debug("Changing encoding of document from " +doc.charset());
doc.updateMetaCharsetElement(true);
doc.charset(Charset.forName("UTF-8"));
logger.debug("Changed encoding of document to: " +doc.charset());
}
return doc;
阅读内容的示例日志输出(来自已部署的应用程序)。
Encoding of response: utf-8
Response has expected charset
Encoding of document: UTF-8
示例输入:
<tr><th>Nationalität:</th> <td> [...] </td> </tr>
示例代码对包含 ä、ö、ü 或 ß 的词失败但对其他词工作正常:
Element header = row.select("th").first();
String text = header.ownText();
if("Nationalität:".equals(text))
{
// goes here in eclipse
}
else
{
// and here in deployed spring boot app
}
从 Eclipse 运行与我缺少的构建和部署的应用程序之间有什么区别吗?这种行为还可能从何而来?我该如何解决?
据我所知,这不是(直接)编码问题,因为输入正确显示“Umlaute”...由于这在调试时不可重现,我很难弄清楚到底出了什么问题。
编辑:虽然输入在日志中看起来不错(即变音符号正确显示),但我意识到它们在控制台中看起来不正确: <th>Nationalit├ñt:</th>
我目前正在按照 Mirko 的建议使用 Normalizer,如下所示: Normalizer.normalize(input, Form.NFC);
(也用 NFD 试过)。(SpringBoot-) 控制台和 (logback) 日志输出有何不同?
最佳答案
像变音符号这样的变音符号在 unicode 中通常可以用两种不同的方式表示:作为单代码点字符或作为两个字符的组合。这不是编码问题,它可能发生在 UTF-8、UTF-16、UTF-32 等格式中。Java 的 equals 方法可能不会将复合字符视为等于单代码点字符,即使它们看起来完全相同。尝试查看您正在比较的字符串的二进制表示,这样您应该能够找出差异。您还可以使用“Character”类的方法遍历字符串并打印出所有字符的属性。也许这也有助于找出差异。
在任何情况下,如果您在“等号”的“两侧”使用 java.text.Normalizer
将文本规范化为例如 Unicode 规范化形式 C,这可能会有所帮助。这样,应该理顺上述差异,并且字符串应该按预期进行比较。
关于java - Gradle / eclipse : Different behavior of german "Umlaute" when using equality?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445077/
我们所有基于文本的文件均采用 UTF-8 或 latin-1 (Windows) 编码。我们使用的唯一“特殊字符”是德语变音符号 ä、ö、ü 和 ß。 由于各种原因(包括历史原因,还有“属性文件不能是
目前,我的应用支持英语和德语 本地化,为此我使用了Localizable.strings .您可以在下面的图片中看到项目设置和 Localizable。 现在我在德语本地化方面遇到了问题。在 iPho
months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktob
我已经使用 Collator 对对象数组进行排序。但我发现它像对待普通字母一样对待重音字母: Aktivierung Änderung Auszahlung Bar 相反,我想要这个 Aktivi
我有一个实用类 TestCracker。它有一个 testInput 方法,该方法接受文本,将请求发送到以该文本作为参数的翻译服务并返回响应 JSON 字符串: public class TestCr
我知道如何使用(简单的)key=function 自定义排序。但是,如果我需要更复杂的 key= 函数,该怎么做。我在整理它时遇到了问题。 这是片段:在第一个示例中,我使用 key=locale.st
我正在关注 internationalization chapter .完成将内容翻译成德语的步骤后,当我尝试在浏览器中加载页面时出现此错误: 11:26:27.142 [ERROR] [stockw
我正在寻找 jquery 验证插件 ( http://bassistance.de/jquery-plugins/jquery-plugin-validation/ ) 的方法,该方法只接受字母,包括
我使用 jQuery DataTables 插件,我的问题是我的德国日期没有正确排序。它具有以下格式:dd.mm.YYYY HH:iih 这是我的代码: JSFIDDLE: https://jsfid
我将 Flyway 4.0 与 SpringBoot 1.3.0.RELEASE 和 MySQL 5.6.27 社区服务器一起使用。 当我使用 MySQL Workbench 检查我的架构时,它具有“
我正在使用一个小的 Javascript/Jquery 函数将一个元素注入(inject)到一些文本中,如果还没有这样的元素的话。 代码如下所示: $(document).ready(function
Apache lucene 中是否有一个选项可以正确排序数字和德语变音符号,这意味着,例如“Ü”应解释为“Ue”,表示排序顺序为 U, Ü, Z 而不是: U, Z, Ü 类似于 lucene 默认值
我正在尝试打开一个文件,其文件名是通过在附加了 Tkinter.StringVar 的 ttk.Entry 中键入而创建的。 如果我尝试通过在另一个文件中输入相同的文件名来再次open()该文件如果我
我需要将日期解析为 11 种不同的语言。到目前为止,只有两个给我带来麻烦:德语和乌克兰语。 package com.example; import java.text.ParseException;
我想在我的应用程序布局中做这样的事情: %title= "#{yield(:sub_title)} - Page Name" 在真实的视野中 - content_for :sub_title do
我们的 WooCommerce 网站有一个自定义注册页面,该页面基于 Business Bloomer 短代码,并为用户的名字添加了一个输入字段。我们的functions.php 中的代码如下所示:
我正在将一些输入流从我的 DVB S2 卡转换为 RTMP。 切换到最近的 avconv 和 x264 后一切正常 :) 我唯一不知道的是,如何选择正确的音频流? 源有时最多有 6 个音轨。 Avco
我想使用正则表达式验证用户发送的名字。我找到了多个名字表达式,但我还想添加德语字符,例如 äöüß 和法语字符 à À è È é É ù Ù ì Ì ò Ò ñ Ñ到它。我尝试了 SO here 建
这里是保罗。我是 JavaScript 的新手,正在尝试构建一个类似于这个问题中描述的闹钟: Why does my alarmclock script stop working? 来自 Whakke
我无法用德语显示以下操作的月份: var date = moment.unix(valueTimestamp).format("DD. MMMM YYYY"); 我已经尝试了以下方法,但它不起作用:
我是一名优秀的程序员,十分优秀!