С ++ отфильтровывают китайскую строку (GBK, UTF-8)

В последнее время такие вещи, как для обработки текстов чувствительной игры, для того, чтобы усилить процесс маскирования, поэтому необходимо, чтобы отфильтровать строки символов в дополнение к другим вещам, таким как числа, символы, буквы и так далее.

Во-первых, доступ к информации, и я написал функцию:

Пример: Возвращает количество символов в строке ввода:

станд :: строка StrWithOutSymbol ( Const станд :: строка & источник) 
{     
    строка sourceWithOutSymbol; 

    Int я = 0 ;
    в то время как (источник [I] =! 0 ) 
    { 
        если (источник [I] & 0x80 ) 
        { 
            sourceWithOutSymbol + = источник [I]; 
            sourceWithOutSymbol + = источник [I + 1 ]; 
            я + = 2 ;
        еще 
        { 
            я ++  ;
        }
    } 
    возвращение
   sourceWithOutSymbol ; 
}

Принцип этой функции Ord ($ строка) и 0x80 судить китайские иероглифы 

80, соответствующий двоичный код 1000 0000, самый старший бит равен единице, представитель формат кодирования кандзи известен как формат 10 символов занимает 2 байта, но представляют собой символ

«Окна, упрощенный китайский набор символов кодирования одновременно один байт и 2 байта для представления Когда настало время является 0x00 ~ 0x7F, один байт, 0x80 высока, чем при выраженных 2 байта "

Когда вы находите содержание байта больше , чем 0x7F, то оно должно быть (с другой байт в пестрой) символов, конечно , больше , чем 0x7F , как судить?
0x7F (1111111) за номер , который 0x80 (10000000), так что я хочу больше 0x7F, самый старший бит этого байта, безусловно , 1, нам нужно только определить , является ли старший бит равен 1 в списке.

Анализируя метод:
биты и (то же самое только 1 бит равен 1, в противном случае 0):
как: Для того, чтобы определить , является ли третье число представляет собой 4 с длиной (100) и бит, первого определения, ряд 2 1 всего 2 (10) битов с.
Аналогично определить , следует ли восьмое место с только 1 (10000000) является 0x80 бит с.

Почему здесь нет> 0x7F? PHP линия может также, в другом внутри строго типизированным язык, самые старшие бит байт, используемый для обозначения отрицательных, отрицательная, конечно, не может быть больше, чем 0x7F (наибольшее целое)


Другой пример:
код является assic 97 (1100001)
assic код является 65 (1000001)

б assic код 98 (1100010)
assic код Б 66 (1000010)

Найденный образец: письмо А.З., до тех пор , как строчные буквы, шестое место, безусловно , 1, мы можем использовать эту функцию, чтобы определить случай: на
этот раз, пока с буквами с 0x20 (100000) , чтобы разместить и суждение:
IF ( ДВ (A $) и 0x20) {
        // прописные
}

Как поместить все заглавные буквы на шестое место на линии 1 в 0 :? 
$ A = 'A';
$ A = CHR (ог ($ A) & (~ 0x20));
эхо $ A;

 

Я уверен, что тогда эта функция добавлена ​​в проект, выберите команду Выполнить, введите китайский чек, когда! Проект отдается? ? ? ? Массивы границы? ? ? ?

Вот почему, я определить, где была обнаружена ошибка Кокосовые-Lua я использую при передаче строки в C ++ строка передается в UTF-8, чтобы закодировать, я пошел к ПИФ-8 правила кодирования найдены

правила UTF-8 кодирования: если только один байт старший бит равен 0, если это мульти-байты, первый байт от самого высокого уровня, число последовательных двоичного 1-битового значения определяет, который кодирует количество оставшихся байт 10 байт начинает. UTF-8, таблица преобразования следующим образом:

 

 

 И прежде чем я работал в соответствии с кодировкой GBK, GBK два байта для каждого иероглифа только, и, если возможно, китайские UTF-8 3 байта, четыре байта, пять или даже шесть, так с функцией так же, как будет трансграничная ситуация возникает, поэтому строка кодируется с UTF-8, на необходимость дополнительной обработки, поэтому я написал новую функцию:

UTF-8, строка в кодировке в китайском скрининге функции:

станд :: строка censorStrWithOutSymbol ( Const станд :: строка & источник) 
{     
    строка sourceWithOutSymbol; 

    Int я = 0 ;
    в то время как (источник [I] =! 0 ) 
    { 
        если (источник [I] & 0x80 && источник [I] & 0x40 && источник [I] & 0x20 ) 
        { 
            INT ByteCount = 0 ;
            если (источник [I] & 0x10 ) 
            { 
                ByteCount = 4 ;
            } 
            Иначе 
            { 
                ByteCount = 3 ; 
            } 
            Для ( Int а = 0 ; а <ByteCount; A ++ ) 
            { 
                sourceWithOutSymbol + = источника [I]; 
                я ++ ; 
            } 
        } 
        Еще  если (источник [I] & 0x80 && источник [I] & 0x40 ) 
        { 
            я + = 2 ; 
        } 
        Еще 
        { 
            я+ = 1 ; 
        } 
    } 
    Вернуть sourceWithOutSymbol; 
}

Нажмите кнопку Выполнить, успех! Удобный.

рекомендация

отwww.cnblogs.com/kpxy/p/11256791.html