Описание функции
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