В чем может быть проблема? (SQLite)
#1

Суть: Сервер не распознает как русский текст, который загружает в БД.

Как всё происходит: Добавляю в БД русский текст. (Слово "Ленивый")
В БД он выглядит как "�������" (если смотреть через SQLiteDatabaseBrowserPortable)
Позже, загружаю из БД обратно на сервер в массив, текст уже обретает нормальный вид.

Проблема, когда пропускаю загруженное слово из массива через ф-ию:
PHP код:
FixText(string[]) {
    new 
result[256];
    
printf("Фиксануло, до: %s",string);
    for(new 
i=0strlen(string); i++) {
        switch(
string[i]) {
            case 
'а':result[i] = 'a';
            case 
'А':result[i] = 'A';
            case 
'б':result[i] = '—';
            case 
'Б':result[i] = 'Ђ';
            case 
'в':result[i] = 'ў';
            case 
'В':result[i] = '‹';
            case 
'г':result[i] = '™';
            case 
'Г':result[i] = '‚';
            case 
'д':result[i] = 'љ';
            case 
'Д':result[i] = 'ѓ';
            case 
'е':result[i] = 'e';
            case 
'Е':result[i] = 'E';
            case 
'ё':result[i] = 'e';
            case 
'Ё':result[i] = 'E';
            case 
'ж':result[i] = '›';
            case 
'Ж':result[i] = '„';
            case 
'з':result[i] = 'џ';
            case 
'З':result[i] = '?';
            case 
'и':result[i] = 'њ';
            case 
'И':result[i] = '…';
            case 
'й':result[i] = 'њ';
            case 
'Й':result[i] = '…';
            case 
'к':result[i] = 'k';
            case 
'К':result[i] = 'K';
            case 
'л':result[i] = 'ћ';
            case 
'Л':result[i] = '‡';
            case 
'м':result[i] = 'Ї';
            case 
'М':result[i] = 'M';
            case 
'н':result[i] = '®';
            case 
'Н':result[i] = '-';
            case 
'о':result[i] = 'o';
            case 
'О':result[i] = 'O';
            case 
'п':result[i] = 'Ј';
            case 
'П':result[i] = 'Њ';
            case 
'р':result[i] = 'p';
            case 
'Р':result[i] = 'P';
            case 
'с':result[i] = 'c';
            case 
'С':result[i] = 'C';
            case 
'т':result[i] = '¦';
            case 
'Т':result[i] = 'Џ';
            case 
'у':result[i] = 'y';
            case 
'У':result[i] = 'Y';
            case 
'ф':result[i] = '?';
            case 
'Ф':result[i] = 'Ѓ';
            case 
'х':result[i] = 'x';
            case 
'Х':result[i] = 'X';
            case 
'ц':result[i] = ' ';
            case 
'Ц':result[i] = '‰';
            case 
'ч':result[i] = '¤';
            case 
'Ч':result[i] = 'Ќ';
            case 
'ш':result[i] = 'Ґ';
            case 
'Ш':result[i] = 'Ћ';
            case 
'щ':result[i] = 'Ў';
            case 
'Щ':result[i] = 'Љ';
            case 
'ь':result[i] = '©';
            case 
'Ь':result[i] = '’';
            case 
'ъ':result[i] = 'ђ';
            case 
'Ъ':result[i] = '§';
            case 
'ы':result[i] = 'Ё';
            case 
'Ы':result[i] = '‘';
            case 
'э':result[i] = 'Є';
            case 
'Э':result[i] = '“';
            case 
'ю':result[i] = '«';
            case 
'Ю':result[i] = '”';
            case 
'я':result[i] = '¬';
            case 
'Я':result[i] = '•';
            default:
result[i]=string[i];
        }
    }
    
printf("Фиксануло, после: %s",result);
    return 
result;

выдает в лог:
Quote:

[13:57:48] Фиксануло, до: Ленивый
[13:57:48] Фиксануло, после: Ленивый

"Принудительная" фиксация работает нормально:
PHP код:
printf("Фиксануло,\"Ленивый\": %s",FixText("Ленивый")); 
выдает в лог:
Quote:

[13:57:11] Фиксануло, до: Ленивый
[13:57:11] Фиксануло, после: ‡e®њўЁњ
[13:57:11] Фиксануло,"Ленивый": ‡e®њўЁњ

Reply
#2

Нахрена такие костыли, когда можно просто сменить кодировку? О_о
Reply
#3

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Нахрена такие костыли, когда можно просто сменить кодировку? О_о
а точнее? о.О
Reply
#4

Ну, в sqlite при создании таблицы можно указать кодировку, если мне память не изменяет:
PRAGMA encoding = "UTF-8"
Reply
#5

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Ну, в sqlite при создании таблицы можно указать кодировку, если мне память не изменяет:
PRAGMA encoding = "UTF-8"
да там такая кодировка и стоит, не в том суть.
ты не понял вопроса)
по кодировке, вроде нормально приходит из БД.

просто при приобразовании русского текста через сток в нужный мне (для отображения в TD) не хочет конвертить сток...
Reply
#6

Эм, провел тест "интересный", вот что вышло...
добавил в сток
PHP код:
    for(new i=0strlen(string); i++) {
        
printf("Буква %s - %d",string[i],string[i]);
    } 
при принудительной конвертации в лог:
PHP код:
[16:12:23ФиксанулодоЛенивый
[16:12:23Буква Ленивый 203
[16:12:23Буква енивый 229
[16:12:23Буква нивый 237
[16:12:23Буква ивый 232
[16:12:23Буква вый 226
[16:12:23Буква ый 251
[16:12:23Буква й 233
[16:12:23Фиксанулопосле‡e®њўЁњ 
при конвертации теста, загруженного в массив из базы данных:
PHP код:
[16:13:09ФиксанулодоЛенивый
[16:13:09Буква Ленивый - -53
[16:13:09Буква енивый - -27
[16:13:09Буква нивый - -19
[16:13:09Буква ивый - -24
[16:13:09Буква вый - -30
[16:13:09Буква ый - -5
[16:13:09Буква й - -23
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква  0
[16:13:09Буква Р›РµРЅРёРІС‹Р№ - -48
[16:13:09Буквࠛенивый - -101
[16:13:09Буква РµРЅРёРІС‹Р№ - -48
[16:13:09Букв࠵нивый - -75 
WTF?

извлечение, самое бональное:
PHP код:
db_get_field_assoc(u_result"rrRecordsManDrift"rrRaces[i][rrRecordsManDrift],sizeof(string)); 
Reply
#7

Букву надо выводить через %c, а не %s.
Reply
#8

Quote:
Originally Posted by stabker
Посмотреть сообщение
Букву надо выводить через %c, а не %s.
ну ок. только не решит это проблему)
PHP код:
[16:57:01Буква Л - -53
[16:57:01Буква е - -27
[16:57:01Буква н - -19
[16:57:01Буква и - -24
[16:57:01Буква в - -30
[16:57:01Буква ы - -5
[16:57:01Буква й - -23
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква 
[16:57:01Буква N 78
[16:57:01Буква U 85
[16:57:01Буква L 76
[16:57:01Буква L 76 
хрень какаято...

-----------------------
хотя, кажись придумал как решить. но опят же, костыль...
сделаю, отпишусь
Reply
#9

Вот, костыль придумал...
Чинит текст в тех случаях, когда загруженные из БД SQLite русские слова не распознаются сервером как таковые. Хотя отображаются как должны. Поможет если вы хотите к примеру преобразовать загруженный текст через FixText (для TextDraw-ов)
PHP код:
stock FixSQLiteRusText(const text[]){
    new 
textEx[64];
    
strcat(textEx,text);
    for(new 
fsizeof(textEx); f++){
        if(-
65 textEx[f] < 0)
            
textEx[f]+=256;
    }
    return 
textEx;    

тест функции через
PHP код:
printf("Буква %s - %d",string[i],string[i]); 
до
Код:
[18:35:29] Буква А - -64
[18:35:29] Буква а - -32
[18:35:29] Буква Б - -63
[18:35:29] Буква б - -31
[18:35:29] Буква Ю - -34
[18:35:29] Буква ю - -2
[18:35:29] Буква Я - -33
[18:35:29] Буква я - -1
после
Код:
[18:35:29] Буква А - 192
[18:35:29] Буква а - 224
[18:35:29] Буква Б - 193
[18:35:29] Буква б - 225
[18:35:29] Буква Ю - 222
[18:35:29] Буква ю - 254
[18:35:29] Буква Я - 223
[18:35:29] Буква я - 255
Reply
#10

Quote:
Originally Posted by Gettopro
Посмотреть сообщение
да там такая кодировка и стоит, не в том суть.
ты не понял вопроса)
по кодировке, вроде нормально приходит из БД.

просто при приобразовании русского текста через сток в нужный мне (для отображения в TD) не хочет конвертить сток...
Если бы нормально приходило, не было бы подобной проблемы. Нормально, это когда данные которые ты записал в БД равны тем данным, которые ты взял из БД. А здесь уже какой-то косяк с потерей одного байта в начале текста, или, что более вероятно - с кодировкой.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)