При разборе одного бинарного файла потребовалось преобразовать строки, находящиеся в нем из cp1251 в utf-8. Штатных средств в эрланге не обнаружил. Использовать iconv для этих целей показалось слишком “дорогим” удовольствием. Поэтому вспомнил как делал такую перекодировку лет так 10 назад табличным способом на паскале. Получилось просто и очень нативно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | %% Табличный способ conv(Char) -> Tbl_utf8 = {0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,1025,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,1105,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, 0000,0000,0000,0000,0000,0000,0000,0000,0000,1040,1041,1042,1043, 1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056, 1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069, 1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082, 1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095, 1096,1097,1098,1099,1100,1101,1102,1103}, _Char = element(Char, Tbl_utf8), if _Char =/= 0 -> _Char; true -> Char end. win_to_utf(Str) -> [conv(Char) || Char <- Str]. %% Арифметический способ conv2(Char) -> if Char == 136 -> _Char = Char + 889; %% Ё Char == 168 -> _Char = Char + 969; %% ё Char >= 191 -> _Char = Char + 848; %% А..Яа..я true -> Char end. win_to_utf_2(Str) -> [conv2(Char) || Char <- Str]. |
По ходу дела получилось два способа. Скорость их работы не замерял, просто первый содержит “больше букав”, а второй “меньше букав”. Перекодировка производится только в одну сторону cp1251 -> utf-8.





