Encoding 查找Java项目/源代码中的编码问题

Encoding 查找Java项目/源代码中的编码问题,encoding,findbugs,checkstyle,sonarqube,pmd,Encoding,Findbugs,Checkstyle,Sonarqube,Pmd,我目前正在从事一个Java项目,在这个项目中,监督质量是我工作的一部分。作为工具,我使用詹金斯和声纳。这些工具很棒,帮助我快速、持续地跟踪问题 我无法控制的一个问题是,有些人使用UTF-8以外的编码进行提交 当代码如下所示时: if (someString == "something") { resultString = "string with encoding problem: �"; } 。。。提交后,Sonar将帮助我找到“字符串文字相等”问题。但正如您在第二行中看到的,编码有

我目前正在从事一个Java项目,在这个项目中,监督质量是我工作的一部分。作为工具,我使用詹金斯和声纳。这些工具很棒,帮助我快速、持续地跟踪问题

我无法控制的一个问题是,有些人使用UTF-8以外的编码进行提交

当代码如下所示时:

if (someString == "something") {
    resultString = "string with encoding problem: �";
}
。。。提交后,Sonar将帮助我找到“字符串文字相等”问题。但正如您在第二行中看到的,编码有一个问题:�" 通常应该是一个“ü

是否有可能发现声纳/Findbugs/PMD的此类问题

请指教! 多谢各位


Ps:当然,我已经试着亲自或通过电子邮件向我的合作开发人员解释了这个问题。我甚至自己更改了他们的项目/工作区编码……但不知何故,他们仍然成功地提交了这样的代码。

你可以用Java编写checkstyle和PMD扩展,你可以浏览AST并发现一些东西。问题是代码将已经从某个内容转换为Unicode。该污点字符是一个特定的Unicode字符,用于替换当前编码中无法映射的字符,因此您可以查找这些字符。如果编码混乱导致?或仅仅是一个不正确的字符,这将对您没有帮助。获取Sona可能很困难r来应用您的自定义规则。

我同意@bmargules,它是一个有效的UTF-8字符(实际上是),但毕竟PMD规则可能会有所帮助。下面是一个带有硬编码不允许字符列表的概念验证规则:

import net.sourceforge.pmd.AbstractJavaRule;
import net.sourceforge.pmd.ast.ASTLiteral;

import org.apache.commons.lang3.StringUtils;

public class EncodingRule extends AbstractJavaRule {

    private static final String badChars = "\uFFFD";

    public EncodingRule() {
    }

    @Override
    public Object visit(final ASTLiteral node, final Object data) {
        if (node.isStringLiteral()) {
            final String image = node.getImage();
            if (StringUtils.containsAny(image, badChars)) {
                addViolationWithMessage(data, node, "Disallowed char in '"
                        + image + "'");
            }
        }
        return super.visit(node, data);
    }

}

也许将条件颠倒过来,并使用ASCII字符和本地字符创建一个
allowedChars
白名单会很有用。(还有更多细节。)

这里的概念与PalacInt的答案相同,但使用XPath

  Black list any string that contains X or Y
  //Literal[matches(@Image,"[XY]")]

  White list any string that does not match X or Y 
  //Literal[not(matches(@Image,"[XY]"))]

  Black list any string that contains X using the unicode representation
  //Literal[matches(@Image,"[\u0058]")]
使用XPath可能比使用Java简洁得多

以下是一些教程,介绍如何使用XPath使用自定义PMD规则,以防您或阅读此答案的其他人不熟悉