[РЕШЕНО] ExplodeString криво режет Юникод

hitmany

Участник
Сообщения
171
Реакции
97
Есть длинный текст, его нужно отобразить в виде меню, я написал функцию которая делит строку на 40 символов с помощью ExplodeString и добавляет в конец перенос строки

Но с Юникодом беда, если его так резать появляется Заменяющий символ


Как быть? Используется словарь, на латинице все хорошо. Но я не могу тупо вставить переносы в словарь, т.к. этот текст еще используется для вывода в чат

PHP:
new length = strlen(text);
    decl String:BackupDescr[2][1024], String:LongDescr[10][1024];
    if(length > 40)
    {
        new iStrParags = RoundToCeil(float(length)/40)+1;
      
        for(new str; str<iStrParags; str++)
        {
            if( str == 0 )
            {
                Format(LongDescr[str], 41, text);
          
                ExplodeString(text, LongDescr[str], BackupDescr, 2, 1024, true);
            }
            else {
                Format(LongDescr[str], 41, BackupDescr[1]);
              
                ExplodeString(BackupDescr[1], LongDescr[str], BackupDescr, 2, 1024, true);
            }
        }
        switch( iStrParags )
        {
            case 2: { Format(text, 1024, "%s\n%s", LongDescr[0], LongDescr[1]); }
            case 3: { Format(text, 1024, "%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2]); }
            case 4: { Format(text, 1024, "%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3]); }
            case 5: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4]); }
            case 6: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4], LongDescr[5]); }
            case 7: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4], LongDescr[5], LongDescr[6]); }
            case 8: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4], LongDescr[5], LongDescr[6], LongDescr[7]); }
            case 9: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4], LongDescr[5], LongDescr[6], LongDescr[7], LongDescr[8]); }
            case 10: { Format(text, 1024, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", LongDescr[0], LongDescr[1], LongDescr[2], LongDescr[3], LongDescr[4], LongDescr[5], LongDescr[6], LongDescr[7], LongDescr[8], LongDescr[9]); }
        }
  
    }
 

Вложения

  • Counter-strike  Global Offensive 12.07.2016 - 21.59.42.01.png
    Counter-strike Global Offensive 12.07.2016 - 21.59.42.01.png
    416.5 КБ · Просмотры: 34
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
к чему такие извращения?
нужно бы делать переносы по пробелам
и вообще кириллица занимает 2 байта, а латиница и прочие знаки препинания только 1, если я ничего не путаю
Если это так, то потому-то у тебя режет так кириллические символы

сколько байт в символе можно узнать с помощью GetCharBytes(const String:source[])
Usage:
source Source input string.
Notes:
Returns the number of bytes a character is using. This is for multi-byte characters (UTF-8). For normal ASCII characters, this will return 1.

Return:
Number of bytes the current character uses.
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
@R1KO, там вообще такое месиво, что трудно понять, зачем эти двойные разделения, 2 массива.
Можно и вручную, без ExplodeString разделить всё чётко по словам, если захотеть.
 

hitmany

Участник
Сообщения
171
Реакции
97
к чему такие извращения?
нужно бы делать переносы по пробелам
и вообще кириллица занимает 2 байта, а латиница и прочие знаки препинания только 1, если я ничего не путаю
Если это так, то потому-то у тебя режет так кириллические символы

сколько байт в символе можно с помощью GetCharBytes(const String:source[])

Ну тоже вариант искать пробелы в строке и по ним вырезать, проблема, GetCharBytes поймет что латиница в строке из словаря?
Отсюда например, Format(text, sizeof(text), "%T", "Your text", client);
Спасибо за помощь
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
м/б сделать в переводе что-то типа:
PHP:
    "Text"
    {
        "#format"        "{1:s}"
        "en"            "First line{1}second line{1}third line"
    }
А в плагине использовать в качестве параметров пробел и перенос строки в зависимости от требуемого места вывода текста.
 

hitmany

Участник
Сообщения
171
Реакции
97
м/б сделать в переводе что-то типа:
PHP:
    "Text"
    {
        "#format"        "{1:s}"
        "en"            "First line{1}second line{1}third line"
    }
А в плагине использовать в качестве параметров пробел и перенос строки в зависимости от требуемого места вывода текста.
Круто! Попробую!
--- Добавлено позже ---
м/б сделать в переводе что-то типа:
PHP:
    "Text"
    {
        "#format"        "{1:s}"
        "en"            "First line{1}second line{1}third line"
    }
А в плагине использовать в качестве параметров пробел и перенос строки в зависимости от требуемого места вывода текста.

Только так он не работает) Пишет First line second line{1}third line. Надо скорее всего добавлять параметр в Format)
 
Последнее редактирование:
Сверху Снизу