为什么这些字符被认为是大写?

时间:2012-06-20 20:36:32

标签: javascript passwords special-characters

我正在尝试测试密码。我需要对字符串进行一些测试。当我用toUpperCase()测试它时,我发现我的特殊字符评估为true。我怀疑他们会评价为假。

我应该如何测试特殊字符?

// CREATE ARRAY OF CHARACTERS
CharacterArray = ["1","2","3","a","b","c","D","E","F","/","+",")"];

// TEST CHARACTERS 
function testCharacters() {
    // GET ARRAY LEN
    var CharacterArrayLen = CharacterArray.length;
    // LOOP THROUGH ARRAY
    for (i = 0; i < CharacterArrayLen; i++) {
        // PARSE SINGLE CHARACTER
        var ThisChar = CharacterArray[i];

        if (!isNaN(ThisChar)) {
            alert(ThisChar + ' is numeric!');
        } else {
            if (ThisChar === ThisChar.toUpperCase()) {
                alert(ThisChar + ' is upper case');
            } else if (ThisChar === ThisChar.toLowerCase()) {
                alert(ThisChar + " is lower case");
            }
        }   
    }
}
testCharacters();

4 个答案:

答案 0 :(得分:2)

它们不是大写或小写。 toUpperCasetoLowerCase都会为这些字符返回相同的内容。如果你先测试小写,你会发现它们都是小写的!

您可以使用一些正则表达式来查看字符是否在字母表中。

ThisChar.match(/^[a-zA-Z]$/)

将在非字母字符上返回null

如果您只想查看每个字符是否在您的数组中,您可以使用indexOf

CharacterArray.indexOf('a')
> 3
CharacterArray.indexOf('A')
> -1

第二个返回-1,因为A不在数组中。

这是使用正则表达式的DEMO

答案 1 :(得分:2)

特殊字符是无壳的(既不是小写也不是大写),无论是直觉还是Unicode标准。但是已经定义了JavaScript,以便对于无外壳字符,toUpperCase()toLowerCase()方法返回字符本身。

即使从编辑过的问题中,您还希望测试的是什么,这一点并不明显。但是如果你需要测试一个大写字母或小写字母的字符,那么JavaScript中合适的基本逻辑是这样的:如果是ThisChar !== ThisChar.toUpperCase(),那么ThisChar是一个小写字母; if ThisChar!== ThisChar.LowerCase(), then ThisChar`是一个大写字母;否则,它是无壳的 - 要么是特殊字符,要么是书写系统中不能区分案例的字母。

这个基本逻辑对某些字符失败,例如尖锐的s“ß”,它在Unicode中没有大写映射(因为大写等价物是两个字母,“SS”,这必须单独处理)。因此,如果它们相关,您需要将它们作为特殊情况处理。

在其他编程语言中,您可以简单地使用字符的“常规类别”属性,但JavaScript当前不提供对它的访问权限。您可以从Unicode字符数据库下载相关文件,可能会对其进行预处理以删除不必要的信息,并使您的程序检查常规类别属性,但这有点尴尬,并且每当更改Unicode标准时都需要更新。

答案 2 :(得分:1)

这是预期的行为。如果你删除'else',那么

if (ThisChar === ThisChar.toUpperCase()) {
    alert(ThisChar + ' is upper case');
} else if (ThisChar === ThisChar.toLowerCase()) {
    alert(ThisChar + " is lower case");
}

变为

if (ThisChar === ThisChar.toUpperCase()) {
    alert(ThisChar + ' is upper case');
} if (ThisChar === ThisChar.toLowerCase()) {
    alert(ThisChar + " is lower case");
}

你会看到'/','+'和'('被认为是大写和小写。

当您考虑确定String是否是特定情况的函数时,这是有意义的。说“abcde%”不是全部小写,或者“ABCDE%”不是全部大写真的有意义吗?对于这两种情况,非字母字符定义为大写和小写。

答案 3 :(得分:1)

为什么不使用正则表达式?

function testCharacters(string) {
    var exp = /^[a-z]+$/ig;
    return exp.test(string);
}

请注意,使用正则表达式,您可以立即测试整个字符串,而不必迭代每个字符。