`
coding1688
  • 浏览: 236805 次
  • 来自: 上海
社区版块
存档分类
最新评论

被忽略的双引号

 
阅读更多

被忽略的双引号

在一段从mht文件中提取html内容的程序中,包含如下代码:

 

                String strEncodng = getEncoding(bp1);
                String strText = getHtmlText(bp1, strEncodng);
 

 

在处理某个mht文件时,报如下错误:

 

java.io.UnsupportedEncodingException: "unicode"

 

 

于是,我猜想应该是 strEncodng 为 unicode 所致,可能是文件本身设置的编码有问题,改成别的试试。尝试了UTF8不行,尝试UTF16可以。

 

                String strEncodng = getEncoding(bp1);
                // strEncodng = "UTF8"
                strEncodng = "UTF16";
                String strText = getHtmlText(bp1, strEncodng);
 

 

当然程序不能这样写,否则别的mht文件就无法正确处理了。打个补丁,当编码为 unicode 时,改成 UTF16。

 

                String strEncodng = getEncoding(bp1);
                if (strEncodng.equals("unicode")) {
                    strEncodng = "UTF16";
                }
                String strText = getHtmlText(bp1, strEncodng);
 

 

再次测试,发现还是报上面的异常,怪哉。于是加了日志输出,看到底怎么回事

 

                String strEncodng = getEncoding(bp1);
                log.debug("strEncodng=" + strEncodng);
                if (strEncodng.equals("unicode")) {
                    strEncodng = "UTF16";
                }
                log.debug("strEncodng=" + strEncodng);
                String strText = getHtmlText(bp1, strEncodng);

 

 

执行,发现两次的日志输出一样,根本上就没有进入if判断。

 

01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
 

 

难道 strEncodng 中包含特殊字符,输出看不见吗。于是又加了几行代码来确认

 

                String strEncodng = getEncoding(bp1);
                log.debug("strEncodng=" + strEncodng);
                if (strEncodng.equals("unicode")) {
                    strEncodng = "UTF16";
                } else {
                    log.debug("strEncodng.length=" + strEncodng.length());
                    log.debug("strEncodng.contains=" + strEncodng.contains("unicode"));
                    for (int i = 0; i < strEncodng.length(); ++i) {
                        log.debug("strEncodng[" + i + "]=" + strEncodng.charAt(i) + " " + (int) strEncodng.charAt(i));
                    }
                }
                log.debug("strEncodng=" + strEncodng);
                String strText = getHtmlText(bp1, strEncodng);
 

 

再次执行

 

01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
01:05:01.307 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng.length=9
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng.contains=true
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[0]=" 34
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[1]=u 117
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[2]=n 110
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[3]=i 105
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[4]=c 99
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[5]=o 111
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[6]=d 100
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[7]=e 101
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng[8]=" 34
01:05:01.308 DEBUG http-bio-8080-exec-64 hh1.common.mht.Html2MHTCompiler - strEncodng="unicode"
 

 

终于发现了,strEncodng 中不光包含unicode,在其前后还有双引号包裹着。应该只要把双引号去掉就可以了,于是又改了代码,如下

 

                String strEncodng = getEncoding(bp1);
                strEncodng = strEncodng.replace("\"", "");
                String strText = getHtmlText(bp1, strEncodng);
 

 

不错,通过了。都是那个被忽略的双引号啊。其实早在查看异常的时候和日志的时候就有些警觉,"uncode" 的双引号是字符串的一部分。

 

PS:在实际的测试中,strEncodng 还有可能为 null,加上此判断更加稳妥。

 

                String strEncodng = getEncoding(bp1);
                if (strEncodng == null) {
                    strEncodng = "GBK";
                } else {
                    strEncodng = strEncodng.replace("\"", "");
                }
                String strText = getHtmlText(bp1, strEncodng);
 

 

 

 

 

分享到:
评论

相关推荐

    C#转义字符如何输出双引号等

    在VB.net中,转义双引号需要使用两个双引号表示,例如""成员 常量 等效 说明 ---------------------------------------------------------------------------CrLf vbCrLf Chr(13) + Chr(10) 回车/换行组合符。 ...

    Java正则表达式,提取双引号中间的部分方法

    Java正则表达式提取双引号中间的部分方法 Java正则表达式是Java语言中的一种模式匹配技术,用于字符串的搜索、验证和提取。今天,我们将分享Java正则表达式提取双引号中间的部分方法,这种方法可以应用于各种字符串...

    js 单双引号

    在JavaScript编程语言中,单引号 `'` 和双引号 `"` 都被用来创建字符串。这个主题,"js 单双引号",涉及到它们的使用、差异以及最佳实践。 1. **创建字符串** 在JavaScript中,单引号和双引号都是用于创建字符串的...

    分析PHP中单双引号的误区和双引号小隐患

    然而,双引号带来的安全隐患不容忽视。PHP的可变变量特性(variable variables)和字符串中的变量解析结合,可能会导致安全漏洞。例如: ```php function test(){ echo "abc"; } echo "${@test()}"; // 可能导致...

    java去掉html标签 必须首先去掉双引号的正则.docx

    在处理含有HTML标签的文本时,如果文本中的双引号没有被妥善处理,可能会导致正则表达式匹配错误,从而影响到HTML标签的去除效果。因此,我们需要一个合理的方案来先处理掉文本中的双引号,然后再去除HTML标签。 ##...

    PHP的单引号和双引号 字符串效率

    然而,如果字符串中包含变量,那么双引号的语法更加直观且易于阅读,虽然会带来一点性能上的损失,但这通常在大多数应用中是可以忽略不计的。 在实际开发中,应根据具体情况权衡性能与可读性。如果性能至关重要,...

    linux shell中单引号、双引号、反引号、反斜杠的区别

    在Linux Shell编程中,了解和掌握单引号、双引号、反引号和反斜杠的区别至关重要,因为它们在处理字符串和命令时起到不同的作用。 1. 单引号(' '): 单引号的作用是告诉Shell忽略其内部的所有特殊字符。这意味着...

    MySQL如何导入csv格式数据文件解决方案

    3、字符串以半角双引号包围,字符串本身的双引号用两个双引号表示。 Sql代码 代码如下: load data infile ‘D:\\top-1m.csv’ into table `site` fields terminated by ‘,’ optionally enclosed by ‘”‘ ...

    详解Linux中关于引号的那些事

    - **双引号**:与单引号不同,双引号允许在其中使用变量和命令替换。这使得我们可以轻松地将变量值嵌入到字符串中。 ```bash USER=john echo "Hello, $USER" # 输出结果:Hello, john ``` #### 引用单个字符 ...

    浅析Python 引号、注释、字符串

    Python支持多种引号形式,包括单引号、双引号以及三重引号(三对单引号或三对双引号),这些引号在不同的场景下有着各自独特的用途。 1. **单引号和双引号**: - 单引号(' ')和双引号(" ")均可用于定义字符串...

    ourphp存储型xss漏洞1

    然而,这个函数虽然对一些常见的SQL关键字进行了替换,例如`and`、`or`、`execute`等,并且对尖括号和单引号进行了转义,但它忽略了对双引号的处理。这意味着攻击者可以通过输入包含双引号的恶意字符串,绕过现有的...

    如何:让Oracle表及字段显示为区分大小写

    当没有使用双引号来定义标识符时,Oracle默认将这些标识符转换为大写,并存储为大写形式。然而,通过使用双引号(`"`),可以明确地告诉Oracle保持标识符的原始大小写状态。 **Oracle内部表存储原理** Oracle...

    python三引号如何输入

    当你使用三个单引号(```'''```)或三个双引号(```"""```)来定义一个字符串时,可以跨越多行进行书写。这种语法允许你在字符串中直接换行,而不需要在每一行末尾添加反斜杠(`\`)作为续行符。例如: ```python ...

    Json转对象忽略大小写

    标准的JSON规范要求键(key)必须使用双引号括起,并且大小写敏感。然而,有时我们可能遇到JSON字符串的键首字母大写的情况,这与Java中的驼峰命名规则不一致,导致反序列化时出现匹配问题。标题“Json转对象忽略大...

    YAS:又一个壳。 作为 COP4600 (OS) 项目构建的简化(但很棒且编写良好)的控制台

    #####Escaping 双引号 ( " ) 之间的所有字符都被视为一个单词,并且所有元字符都将被忽略。唯一的例外是当反斜杠后跟双引号 ( \" ) 时,在这种情况下删除反斜杠并忽略双引号。 可以使用反斜杠 ( \ ) 忽略单个元字符...

    前端开源库-coffeelint-prefer-double-quotes

    `coffeelint-prefer-double-quotes` 是一个针对CoffeeScript语言的开源库,它旨在帮助开发者遵循特定的编码规范,特别是倾向于使用双引号的规则。CoffeeScript是一种简洁、富有表达力的JavaScript方言,它在语法上...

    linux基础学习8

    关于`$*`和`$@`的区别,两者在未被双引号包含时表现相同,但当被双引号包含时,`$*`将所有参数视为一个整体,以单个字符串形式输出,而`$@`则保持参数的独立性,分别输出每个参数。 综上所述,Linux基础学习8的重点...

    mysql表名忽略大小写配置方法详解

    所有表名在硬盘上都被转化为小写存储,查询时也会自动转换为小写进行匹配。同时,数据库名和表的别名也会遵循此规则。 值得注意的是,当`lower_case_table_names`设置为1时,即使在创建表时使用了大写字母,MySQL也...

    第四关测验总结1

    2)双引号(""): 双引号允许某些特殊字符如变量($、`、\)被解析,但会阻止其他特殊字符如`*`、`?`、`#`等进行文件名扩展和词法分析。例如,`echo "Hello $USER"`将输出当前用户的用户名。然而,`echo "Hello *"`并不...

    八大容易忽略的XHTML规则

    XHTML要求所有的属性值都必须用双引号或单引号括起来。例如: ```xml ``` 如果属性值没有被引号包围,则可能导致文档不合法,从而无法通过验证。 #### 4. **使用正确的命名空间** 对于使用了多个命名空间的文档,...

Global site tag (gtag.js) - Google Analytics