При разборе одного бинарного файла потребовалось преобразовать строки, находящиеся в нем из 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.

Tagged with:  

Leave a Reply

You must be logged in to post a comment.