Первая строка, которая терпит неудачу - አማርኛ
. Первый символ አ
находится в юникоде 12A0
(см. здесь ). В UTF-8 это b'\xe1\x8a\xa0'
. Итак, эта часть, очевидно, в порядке. Файл действительно UTF-8.
Печать не вызвала исключение, поэтому ваша выходная кодировка может обрабатывать все символы. Все хорошо.
Единственная оставшаяся причина, по которой я вижу, что он не работает, заключается в том, что шрифт, используемый в консоли, поддерживает не все символы.
Если это только для игры, вам не стоит об этом беспокоиться. Считайте, что это работает правильно.
С другой стороны, я бы предложил изменить некоторые вещи в вашем коде:
main
рекурсивно для каждой строки. В этом нет абсолютно никакой необходимости, и для более длинного файла это приведет к ограничению глубины рекурсии. Вместо этого используйте цикл for
. for line in lines:
print_line(line, encoding, errors)
row_bytes
и затем снова кодируете в [119 ], что совпадает с line
. Было бы лучше прочитать файл как двоичный файл, разделить его на новые строки и затем декодировать. Тогда у вас будет более четкая картина того, что происходит. with open("languages.txt", 'rb') as f:
raw_file_contents = f.read()
Мне кажется, что Вы прикладываете больше усилий к этому, чем это гарантирует. Рассмотрите:
Если Ваша цель состоит в том, чтобы принять меры против неправильных вводимых номеров телефона, то можно, вероятно, поймать хорошо более чем 90% из них только с очень простой проверкой.
Если Ваша цель состоит в том, чтобы попытаться вынудить пользователей обеспечить верный номер, хотят ли они выделить ту информацию или нет, то Вы взяли безнадежную задачу - даже если Вы смогли получить доступ к точным 100%, up-to-the-second телекоммуникационные базы данных, чтобы проверить, что точный введенный номер в настоящее время жив, Вы все еще не получаете обеспечения, что число, которое они дали Вам, является их собственным. Еще раз простая проверка помешает большинству людей, вводящих поддельные номера, но те, кто готов попробовать больше чем два или три раза, найдут способ победить Ваши попытки получить их числа.
Так или иначе простой тест собирается получить Вас хорошие результаты и входит в более сложные наборы правила, поднимет все больше больше времени при предоставлении все больше небольшого преимущества для Вас (также потенциально добавляя ложные положительные стороны, как уже показано с "семью из той же цифры" и 867-5309 случаев).
В моем исследовании, которое я должен был провести заранее>. <Я нашел, что 7 идентичных цифр являются действительными телефонными номерами. Таким образом, я могу высчитать то правило.
Те параметры выглядят довольно хорошими мне, я мог бы также избежать чисел, запускающихся с 911 только для сейфа.
Если Вы придерживаетесь просто США - и числа канадского формата, я думаю, что следующий 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]
Также необходимо принять во внимание десятиразрядный набор номера, который используется в некоторых областях теперь: это отличается от дальнего набора номера (т.е., 303-555-1234, в противоположность 1-303-555-1234). В некоторых местах действительный телефонный номер является десятью цифрами долго; в других это семь.
В Django существует миленький contrib пакет, названный localflavor, который имеет много страны определенный код доступа, например, индексы или номера телефона. Можно посмотреть в источнике, также видят, как django обрабатывает их для страны, которую требуется использовать; Например: американская проверка Формы. Это может быть большим обращением за помощью для получения информации о странах, из которых Вы знаете мало из также.
867-5309 действительный телефонный номер, который присвоен людям в кодах другой области.
Можно сделать проверку номера телефона внутренне в приложении с помощью регулярных выражений. В зависимости от Вашего языка можно вызвать функцию, которая возвратит 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
Править: Некоторый язык определенные сайты для регулярных выражений:
Если можно проверить код области затем, если Вы действительно, действительно не должен знать их номер телефона, Вы, вероятно, делаете так, как разумно.
Ваши клиенты могут все еще сделать то, что я делаю, который является, выделяют локальное moviefone число.
Кроме того, 123-1234 или 123-4567 только неверные номера, потому что префикс начинается с 1, но 234-5678 или 234-1234 на самом деле было бы допустимо (хотя он выглядит фальшивкой).
Это быстрая функция, которую я использую (ниже). У меня есть доступ к базе данных почтовых индексов, содержащей данные ареакода и префикса, которые обновляются ежемесячно. Я часто думал о том, чтобы выполнить погружение в данные, чтобы подтвердить, что префикс существует для кода города.
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;
}
Я не знаю, подходящее ли это место, это функция форматирования, а не функция проверки, я подумал, давайте поделимся этим с сообществом, может быть, однажды это будет полезно ..
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) объекта.