Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式是否足够,或者是否需要检查编码?_Java_Regex_Character Encoding - Fatal编程技术网

Java 正则表达式是否足够,或者是否需要检查编码?

Java 正则表达式是否足够,或者是否需要检查编码?,java,regex,character-encoding,Java,Regex,Character Encoding,我要求确保电子邮件地址包含标准的美国英语字符。在不讨论这意味着什么以及它是否可取的情况下,我想知道是否一个正则表达式就足以满足这个要求,或者我还需要检查字符集吗 是否存在UTF-8字符可以通过正则表达式,但不能在正则表达式中使用的拉丁字符集中的情况 这是我正在使用的一些代码,在我看来,正则表达式已经足够了,但我需要第二种意见 package misc; import java.io.UnsupportedEncodingException; public class ValidateChar

我要求确保电子邮件地址包含标准的美国英语字符。在不讨论这意味着什么以及它是否可取的情况下,我想知道是否一个正则表达式就足以满足这个要求,或者我还需要检查字符集吗

是否存在UTF-8字符可以通过正则表达式,但不能在正则表达式中使用的拉丁字符集中的情况

这是我正在使用的一些代码,在我看来,正则表达式已经足够了,但我需要第二种意见

package misc;

import java.io.UnsupportedEncodingException;

public class ValidateCharacterSet {
    public static void main(String args[]) {
        String czech = "Český";
        String japanese = "日本語";
        String spanish = "¡Qué magnifico es java!";
        String english = "elephant_in-theRoom@yahoo.com";

        System.out.println("iso check: " + czech + ":" + isISO8859(czech));
        System.out.println("iso check: " + japanese + ":" + isISO8859(japanese));
        System.out.println("iso check: " + spanish + ":" + isISO8859(spanish));
        System.out.println("iso check: " + english + ":" + isISO8859(english));

        System.out.println("");

        System.out.println("regex match: " + czech + ":" + playWithMatches(czech));
        System.out.println("regex match: " + japanese + ":" + playWithMatches(japanese));
        System.out.println("regex match: " + spanish + ":" + playWithMatches(spanish));
        System.out.println("regex match: " + english + ":" + playWithMatches(english));
    }


    /**
     * Returns true if the string is null, or the original string (str) equals the string (encodedAsISO8859)
     * that was encoded ISO-8859-1.
     *
     * @param str String containing bytes for which to check the encoding.
     * @return True if the string is in ISO-8859-1 format.
     */
    private static boolean isISO8859(String str) {
        // a null string is compliant by definition.
        if (str == null) {
            return true;
        }

        try {
            byte[] iso88591Data = str.getBytes("ISO-8859-1");
            String encodedAsISO8859 = new String(iso88591Data, "ISO-8859-1");
            if (str.equals(encodedAsISO8859)) {
                return true;
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return false;
    }

    private static boolean playWithMatches(String str) {
        return (str != null && str.matches("[A-Za-z0-9\\-_\\.@\\+]+"));
    }
}
我认为你把字符集和字符编码搞混了。字符集是允许或可用的字符集,而字符编码描述如何访问字符集。对于ISO-8859-1这样的字符集,这种区别并不明显,在ISO-8859-1中,只有一种标准编码,即传入一个数字可以获得与该数字关联的字符。在处理类似Unicode的字符集时,这一点更为明显,因为一个字符集有多种编码,即(Java在其字符串中使用UTF-16)

一旦定义了字符集(在本例中为“标准美国英语字符”),正则表达式就足以检查给定字符串中的字符是否仅包含字符集中的字符。您不需要这样做,如果没有必要,您也不想处理较低级别的编码问题。举个例子,您的
isISO8859
方法在技术上不能保证有效。当给定的字符/字节作为指定字符编码的一部分无效时,您使用的
getBytes
方法和
String
构造函数都具有未指定的行为