Описание функции


ToCP1252

Преобразует строку в кодировку Windows1252

ToCP1252(*s.Unicode)

Параметры

*s.Unicode Указатель на строку в Unicode

Возвращаемое значение

ничего

Примечания

Полезно в Linux, при чтении ANSI-файлов созданных в Windows, при этом создаётся переменная с данными в юникоде, далее можно преобразовать символы в кодировку Win1251. Теперь данные готовы, чтобы выполнять операции поиск и замена на русском языке, как если бы файл был открыт в Windows, а перед сохранением файла преобразовать в кодировку Win1252 и сохранить как ANSI. Русский язык сохранить в ANSI на Linux невозможно, только UTF-8, а Windows интерпретирует данные как русский текст, используя кодовую страницу 1251.

См. также

ToCP1251

Пример

; AZJIO
; https://www.purebasic.fr/english/viewtopic.php?p=617388#p617388
EnableExplicit

Procedure ToCP1251(*s.Unicode)
    Protected i
    Protected *ptr.Unicode

    While *s\u
        If *s\u > 127 And *s\u < 256
            *ptr = ?CP1251 + (*s\u - 128) * 2
            *s\u = *ptr\u
        EndIf
        *s + SizeOf(Unicode)
    Wend
EndProcedure

Global NewMap cp1251()

Procedure CreateArrCP1251ToUTF()
    Protected i
    Protected *ptr.Unicode
         For i = 128 To 255
        *ptr = ?CP1251 + (i - 128) * 2
        AddMapElement(cp1251(), Chr(*ptr\u))
        cp1251() = i
    Next
;     Debug MapSize(cp1251())
;     исключаем символы, так как они являются сами собой и не требуют подмены
    DeleteMapElement(cp1251(), Chr(152))
    DeleteMapElement(cp1251(), Chr(160))
    DeleteMapElement(cp1251(), Chr(164))
    DeleteMapElement(cp1251(), Chr(166))
    DeleteMapElement(cp1251(), Chr(167))
    DeleteMapElement(cp1251(), Chr(169))
    DeleteMapElement(cp1251(), Chr(171))
    DeleteMapElement(cp1251(), Chr(172))
    DeleteMapElement(cp1251(), Chr(173))
    DeleteMapElement(cp1251(), Chr(176))
    DeleteMapElement(cp1251(), Chr(177))
    DeleteMapElement(cp1251(), Chr(181))
    DeleteMapElement(cp1251(), Chr(182))
    DeleteMapElement(cp1251(), Chr(183))
    DeleteMapElement(cp1251(), Chr(187))
;     Debug MapSize(cp1251())
EndProcedure

Procedure ToCP1252(*s.Unicode)
    Protected i
;     Protected *s.Unicode
;     Protected *ptr.Unicode

    While *s\u
        If FindMapElement(cp1251(), Chr(*s\u))
;             *ptr = ?CP1251 + (*s\u - 128) * 2
            *s\u = cp1251()
        EndIf
        *s + SizeOf(Unicode)
    Wend
EndProcedure


Define i, Text$

For i = 192 To 255
    Text$ + Chr(i)
Next

Debug Text$ ; 1252
ToCP1251(@Text$)
Debug Text$ ; 1251
CreateArrCP1251ToUTF()

ToCP1252(@Text$)
Debug Text$ ; 1252


DataSection
    CP1251:
    Data.u 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, 1033
    Data.u 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, 8221, 8226
    Data.u 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, 1115, 1119, 160
    Data.u 1038, 1118, 1032, 164, 1168, 166, 167, 1025, 169, 1028, 171
    Data.u 172, 173, 174, 1031, 176, 177, 1030, 1110, 1169, 181, 182
    Data.u 183, 1105, 8470, 1108, 187, 1112, 1029, 1109, 1111, 1040, 1041
    Data.u 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052
    Data.u 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063
    Data.u 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074
    Data.u 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085
    Data.u 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096
    Data.u 1097, 1098, 1099, 1100, 1101, 1102, 1103
EndDataSection