Американская проверка номера телефона

Первая строка, которая терпит неудачу - አማርኛ. Первый символ находится в юникоде 12A0 (см. здесь ). В UTF-8 это b'\xe1\x8a\xa0'. Итак, эта часть, очевидно, в порядке. Файл действительно UTF-8.

Печать не вызвала исключение, поэтому ваша выходная кодировка может обрабатывать все символы. Все хорошо.

Единственная оставшаяся причина, по которой я вижу, что он не работает, заключается в том, что шрифт, используемый в консоли, поддерживает не все символы.

Если это только для игры, вам не стоит об этом беспокоиться. Считайте, что это работает правильно.


С другой стороны, я бы предложил изменить некоторые вещи в вашем коде:

  1. Вы выполняете main рекурсивно для каждой строки. В этом нет абсолютно никакой необходимости, и для более длинного файла это приведет к ограничению глубины рекурсии. Вместо этого используйте цикл for.
for line in lines:
    print_line(line, encoding, errors)
  1. Вы открываете файл как UTF-8, поэтому чтение из него автоматически декодирует UTF-8 в Unicode, затем вы кодируете его обратно в row_bytes и затем снова кодируете в [119 ], что совпадает с line. Было бы лучше прочитать файл как двоичный файл, разделить его на новые строки и затем декодировать. Тогда у вас будет более четкая картина того, что происходит.
with open("languages.txt", 'rb') as f:
    raw_file_contents = f.read()

7
задан IAdapter 4 October 2009 в 18:24
поделиться

13 ответов

Мне кажется, что Вы прикладываете больше усилий к этому, чем это гарантирует. Рассмотрите:

Если Ваша цель состоит в том, чтобы принять меры против неправильных вводимых номеров телефона, то можно, вероятно, поймать хорошо более чем 90% из них только с очень простой проверкой.

Если Ваша цель состоит в том, чтобы попытаться вынудить пользователей обеспечить верный номер, хотят ли они выделить ту информацию или нет, то Вы взяли безнадежную задачу - даже если Вы смогли получить доступ к точным 100%, up-to-the-second телекоммуникационные базы данных, чтобы проверить, что точный введенный номер в настоящее время жив, Вы все еще не получаете обеспечения, что число, которое они дали Вам, является их собственным. Еще раз простая проверка помешает большинству людей, вводящих поддельные номера, но те, кто готов попробовать больше чем два или три раза, найдут способ победить Ваши попытки получить их числа.

Так или иначе простой тест собирается получить Вас хорошие результаты и входит в более сложные наборы правила, поднимет все больше больше времени при предоставлении все больше небольшого преимущества для Вас (также потенциально добавляя ложные положительные стороны, как уже показано с "семью из той же цифры" и 867-5309 случаев).

9
ответ дан 6 December 2019 в 10:04
поделиться

В моем исследовании, которое я должен был провести заранее>. <Я нашел, что 7 идентичных цифр являются действительными телефонными номерами. Таким образом, я могу высчитать то правило.

0
ответ дан 6 December 2019 в 10:04
поделиться

Те параметры выглядят довольно хорошими мне, я мог бы также избежать чисел, запускающихся с 911 только для сейфа.

0
ответ дан 6 December 2019 в 10:04
поделиться

Если Вы придерживаетесь просто США - и числа канадского формата, я думаю, что следующий regex мог бы работать: [2-9] [0-9] [0-9] - [2-9] [0-9] [0-9] - [0-9] [0-9] [0-9] [0-9] и! [2-9] [0-9] [0-9]-555-[0-9] [0-9] [0-9] [0-9]

0
ответ дан 6 December 2019 в 10:04
поделиться

Также необходимо принять во внимание десятиразрядный набор номера, который используется в некоторых областях теперь: это отличается от дальнего набора номера (т.е., 303-555-1234, в противоположность 1-303-555-1234). В некоторых местах действительный телефонный номер является десятью цифрами долго; в других это семь.

0
ответ дан 6 December 2019 в 10:04
поделиться

В Django существует миленький contrib пакет, названный localflavor, который имеет много страны определенный код доступа, например, индексы или номера телефона. Можно посмотреть в источнике, также видят, как django обрабатывает их для страны, которую требуется использовать; Например: американская проверка Формы. Это может быть большим обращением за помощью для получения информации о странах, из которых Вы знаете мало из также.

1
ответ дан 6 December 2019 в 10:04
поделиться

867-5309 действительный телефонный номер, который присвоен людям в кодах другой области.

1
ответ дан 6 December 2019 в 10:04
поделиться

Amybe смотрят на ответы на этот вопрос.

2
ответ дан 6 December 2019 в 10:04
поделиться

Можно сделать проверку номера телефона внутренне в приложении с помощью регулярных выражений. В зависимости от Вашего языка можно вызвать функцию, которая возвратит true, если предоставленный номер телефона будет соответствовать выражению.

В PHP:

function phone_number_is_valid($phone) {
    return (eregi('^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$', $phone));
}

Можно искать различные регулярные выражения онлайн. Я нашел тот выше одного по http://regexlib.com/DisplayPatterns.aspx?categoryId=7&cattabindex=2

Править: Некоторый язык определенные сайты для регулярных выражений:

3
ответ дан 6 December 2019 в 10:04
поделиться

Если можно проверить код области затем, если Вы действительно, действительно не должен знать их номер телефона, Вы, вероятно, делаете так, как разумно.

2
ответ дан 6 December 2019 в 10:04
поделиться

Ваши клиенты могут все еще сделать то, что я делаю, который является, выделяют локальное moviefone число.

Кроме того, 123-1234 или 123-4567 только неверные номера, потому что префикс начинается с 1, но 234-5678 или 234-1234 на самом деле было бы допустимо (хотя он выглядит фальшивкой).

1
ответ дан 6 December 2019 в 10:04
поделиться

Это быстрая функция, которую я использую (ниже). У меня есть доступ к базе данных почтовых индексов, содержащей данные ареакода и префикса, которые обновляются ежемесячно. Я часто думал о том, чтобы выполнить погружение в данные, чтобы подтвердить, что префикс существует для кода города.

    public static bool isPhone(string phoneNum)
    {
        Regex rxPhone1, rxPhone2;

        rxPhone1 = new Regex(@"^\d{10,}$");
        rxPhone2 = new Regex(@"(\d)\1\1\1\1\1\1\1\1\1");

        if(phoneNum.Trim() == string.Empty)
            return false;

        if(phoneNum.Length != 10)
            return false;

        //Check to make sure the phone number has at least 10 digits
        if (!rxPhone1.IsMatch(phoneNum))
            return false;

        //Check for repeating characters (ex. 9999999999)
        if (rxPhone2.IsMatch(phoneNum))
            return false;

        //Make sure first digit is not 1 or zero
        if(phoneNum.Substring(0,1) == "1" || phoneNum.Substring(0,1) == "0")
            return false;

        return true;

    }
0
ответ дан 6 December 2019 в 10:04
поделиться

Я не знаю, подходящее ли это место, это функция форматирования, а не функция проверки, я подумал, давайте поделимся этим с сообществом, может быть, однажды это будет полезно ..

Private Sub OnNumberChanged()
    Dim sep = "-"
    Dim num As String = Number.ToCharArray.Where(Function(c) Char.IsDigit(c)) _
                                                 .ToArray
    Dim ext As String = Nothing
    If num.Length > 10 Then ext = num.Substring(10)
    ext = If(IsNullOrEmpty(ext), "", " x" & ext)
    _Number = Left(num, 3) & sep & Mid(num, 4, 3) & sep & Mid(num, 7, 4) & ext
End Sub

Моя функция проверки выглядит так:

Public Shared Function ValidatePhoneNumber(ByVal number As String)
    Return number IsNot Nothing AndAlso number.ToCharArray. _
                                  Where(Function(c) Char.IsNumber(c)).Count >= 10
End Function

Я вызываю эту последнюю функцию @ методом OnNumberChanging (number As String) объекта.

0
ответ дан 6 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: