Как кодируется пробел в windows 1251

Список из 256 символов и их коды в ASCII.

1

Управляющие символы

DEC OCT HEX BIN Символ Escape послед. HTML код Описание
0 000 0x00 00000000 NUL \0 � Нулевой байт
1 001 0x01 00000001 SOH  Начало заголовка
2 002 0x02 00000010 STX  Начало текста
3 003 0x03 00000011 ETX  Конец «текста»
4 004 0x04 00000100 EOT  конец передачи
5 005 0x05 00000101 ENQ  «Прошу подтверждения!»
6 006 0x06 00000110 ACK  «Подтверждаю!»
7 007 0x07 00000111 BEL \a  Звуковой сигнал – звонок
8 010 0x08 00001000 BS \b  Возврат на один символ (BACKSPACE)
9 011 0x09 00001001 TAB \t 	 Табуляция
10 012 0x0A 00001010 LF \n 
 Перевод строки
11 013 0x0B 00001011 VT \v  Вертикальная табуляция
12 014 0x0C 00001100 FF \f  Прогон страницы, новая страница
13 015 0x0D 00001101 CR \r 
 Возврат каретки
14 016 0x0E 00001110 SO  Переключиться на другую ленту (кодировку)
15 017 0x0F 00001111 SI  Переключиться на исходную ленту (кодировку)
16 020 0x10 00010000 DLE  Экранирование канала данных
17 021 0x11 00010001 DC1  1-й символ управления устройством
18 022 0x12 00010010 DC2  2-й символ управления устройством
19 023 0x13 00010011 DC3  3-й символ управления устройством
20 024 0x14 00010100 DC4  4-й символ управления устройством
21 025 0x15 00010101 NAK  «Не подтверждаю!»
22 026 0x16 00010110 SYN  Символ для синхронизации
23 027 0x17 00010111 ETB  Конец текстового блока
24 030 0x18 00011000 CAN  Отмена
25 031 0x19 00011001 EM  Конец носителя
26 032 0x1A 00011010 SUB  Подставить
27 033 0x1B 00011011 ESC \e  Escape (Расширение)
28 034 0x1C 00011100 FS  Разделитель файлов
29 035 0x1D 00011101 GS  Разделитель групп
30 036 0x1E 00011110 RS  Разделитель записей
31 037 0x1F 00011111 US  Разделитель юнитов
127 177 0x7F 01111111 Delete  Символ для удаления (на перфолентах)

2

Печатные символы

DEC OCT HEX BIN Символ HTML код Мнемоника
32 040 0x20 00100000 Пробел  
33 041 0x21 00100001 ! !
34 042 0x22 00100010 « " "
35 043 0x23 00100011 # #
36 044 0x24 00100100 $ $
37 045 0x25 00100101 % %
38 046 0x26 00100110 & & &
39 047 0x27 00100111 ' '
40 050 0x28 00101000 ( (
41 051 0x29 00101001 ) )
42 052 0x2A 00101010 * *
43 053 0x2B 00101011 + +
44 054 0x2C 00101100 , ,
45 055 0x2D 00101101 -
46 056 0x2E 00101110 . .
47 057 0x2F 00101111 / /
48 060 0x30 00110000 0 0
49 061 0x31 00110001 1 1
50 062 0x32 00110010 2 2
51 063 0x33 00110011 3 3
52 064 0x34 00110100 4 4
53 065 0x35 00110101 5 5
54 066 0x36 00110110 6 6
55 067 0x37 00110111 7 7
56 070 0x38 00111000 8 8
57 071 0x39 00111001 9 9
58 072 0x3A 00111010 : :
59 073 0x3B 00111011 ; &#59;
60 074 0x3C 00111100 < &#60; &lt;
61 075 0x3D 00111101 = &#61;
62 076 0x3E 00111110 > &#62; &gt;
63 077 0x3F 00111111 ? &#63;
64 100 0x40 01000000 @ &#64;
65 101 0x41 01000001 A &#65;
66 102 0x42 01000010 B &#66;
67 103 0x43 01000011 C &#67;
68 104 0x44 01000100 D &#68;
69 105 0x45 01000101 E &#69;
70 106 0x46 01000110 F &#70;
71 107 0x47 01000111 G &#71;
72 110 0x48 01001000 H &#72;
73 111 0x49 01001001 I &#73;
74 112 0x4A 01001010 J &#74;
75 113 0x4B 01001011 K &#75;
76 114 0x4C 01001100 L &#76;
77 115 0x4D 01001101 M &#77;
78 116 0x4E 01001110 N &#78;
79 117 0x4F 01001111 O &#79;
80 120 0x50 01010000 P &#80;
81 121 0x51 01010001 Q &#81;
82 122 0x52 01010010 R &#82;
83 123 0x53 01010011 S &#83;
84 124 0x54 01010100 T &#84;
85 125 0x55 01010101 U &#85;
86 126 0x56 01010110 V &#86;
87 127 0x57 01010111 W &#87;
88 130 0x58 01011000 X &#88;
89 131 0x59 01011001 Y &#89;
90 132 0x5A 01011010 Z &#90;
91 133 0x5B 01011011 [ &#91;
92 134 0x5C 01011100 \ &#92;
93 135 0x5D 01011101 ] &#93;
94 136 0x5E 01011110 ^ &#94;
95 137 0x5F 01011111 _ &#95;
96 140 0x60 01100000 ` &#96;
97 141 0x61 01100001 a &#97;
98 142 0x62 01100010 b &#98;
99 143 0x63 01100011 c &#99;
100 144 0x64 01100100 d &#100;
101 145 0x65 01100101 e &#101;
102 146 0x66 01100110 f &#102;
103 147 0x67 01100111 g &#103;
104 150 0x68 01101000 h &#104;
105 151 0x69 01101001 i &#105;
106 152 0x6A 01101010 j &#106;
107 153 0x6B 01101011 k &#107;
108 154 0x6C 01101100 l &#108;
109 155 0x6D 01101101 m &#109;
110 156 0x6E 01101110 n &#110;
111 157 0x6F 01101111 o &#111;
112 160 0x70 01110000 p &#112;
113 161 0x71 01110001 q &#113;
114 162 0x72 01110010 r &#114;
115 163 0x73 01110011 s &#115;
116 164 0x74 01110100 t &#116;
117 165 0x75 01110101 u &#117;
118 166 0x76 01110110 v &#118;
119 167 0x77 01110111 w &#119;
120 170 0x78 01111000 x &#120;
121 171 0x79 01111001 y &#121;
122 172 0x7A 01111010 z &#122;
123 173 0x7B 01111011 { &#123;
124 174 0x7C 01111100 | &#124;
125 175 0x7D 01111101 } &#125;
126 176 0x7E 01111110 ~ &#126;

3

Расширенные символы ASCII Win-1251 кириллица

DEC OCT HEX BIN Символ HTML код Мнемоника
128 200 0x80 10000000 Ђ &#128;
129 201 0x81 10000001 Ѓ &#129;
130 202 0x82 10000010 &#130; &sbquo;
131 203 0x83 10000011 ѓ &#131;
132 204 0x84 10000100 &#132; &bdquo;
133 205 0x85 10000101 &#133; &hellip;
134 206 0x86 10000110 &#134; &dagger;
135 207 0x87 10000111 &#135; &Dagger;
136 210 0x88 10001000 &#136; &euro;
137 211 0x89 10001001 &#137; &permil;
138 212 0x8A 10001010 Љ &#138;
139 213 0x8B 10001011 &#139; &lsaquo;
140 214 0x8C 10001100 Њ &#140;
141 215 0x8D 10001101 Ќ &#141;
142 216 0x8E 10001110 Ћ &#142;
143 217 0x8F 10001111 Џ &#143;
144 220 0x90 10010000 Ђ &#144;
145 221 0x91 10010001 &#145; &lsquo;
146 222 0x92 10010010 &#146; &rsquo;
147 223 0x93 10010011 &#147; &ldquo;
148 224 0x94 10010100 &#148; &rdquo;
149 225 0x95 10010101 &#149; &bull;
150 226 0x96 10010110 &#150; &ndash;
151 227 0x97 10010111 &#151; &mdash;
152 230 0x98 10011000 Начало строки &#152;
153 231 0x99 10011001 &#153; &trade;
154 232 0x9A 10011010 љ &#154;
155 233 0x9B 10011011 &#155; &rsaquo;
156 234 0x9C 10011100 њ &#156;
157 235 0x9D 10011101 ќ &#157;
158 236 0x9E 10011110 ћ &#158;
159 237 0x9F 10011111 џ &#159;
160 240 0xA0 10100000 Неразрывный пробел &#160; &nbsp;
161 241 0xA1 10100001 Ў &#161;
162 242 0xA2 10100010 ў &#162;
163 243 0xA3 10100011 Ј &#163;
164 244 0xA4 10100100 ¤ &#164; &curren;
165 245 0xA5 10100101 Ґ &#165;
166 246 0xA6 10100110 ¦ &#166; &brvbar;
167 247 0xA7 10100111 § &#167; &sect;
168 250 0xA8 10101000 Ё &#168;
169 251 0xA9 10101001 © &#169; &copy;
170 252 0xAA 10101010 Є &#170;
171 253 0xAB 10101011 « &#171; &laquo;
172 254 0xAC 10101100 ¬ &#172; &not;
173 255 0xAD 10101101 Мягкий перенос &#173; &shy;
174 256 0xAE 10101110 ® &#174; &reg;
175 257 0xAF 10101111 Ї &#175;
176 260 0xB0 10110000 ° &#176; &deg;
177 261 0xB1 10110001 ± &#177; &plusmn;
178 262 0xB2 10110010 І &#178;
179 263 0xB3 10110011 і &#179;
180 264 0xB4 10110100 ґ &#180;
181 265 0xB5 10110101 µ &#181; &micro;
182 266 0xB6 10110110 &#182; &para;
183 267 0xB7 10110111 · &#183; &middot;
184 270 0xB8 10111000 ё &#184;
185 271 0xB9 10111001 &#185;
186 272 0xBA 10111010 є &#186;
187 273 0xBB 10111011 » &#187; &raquo;
188 274 0xBC 10111100 ј &#188;
189 275 0xBD 10111101 Ѕ &#189;
190 276 0xBE 10111110 ѕ &#190;
191 277 0xBF 10111111 ї &#191;
192 300 0xC0 11000000 А &#192;
193 301 0xC1 11000001 Б &#193;
194 302 0xC2 11000010 В &#194;
195 303 0xC3 11000011 Г &#195;
196 304 0xC4 11000100 Д &#196;
197 305 0xC5 11000101 Е &#197;
198 306 0xC6 11000110 Ж &#198;
199 307 0xC7 11000111 З &#199;
200 310 0xC8 11001000 И &#200;
201 311 0xC9 11001001 Й &#201;
202 312 0xCA 11001010 К &#202;
203 313 0xCB 11001011 Л &#203;
204 314 0xCC 11001100 М &#204;
205 315 0xCD 11001101 Н &#205;
206 316 0xCE 11001110 О &#206;
207 317 0xCF 11001111 П &#207;
208 320 0xD0 11010000 Р &#208;
209 321 0xD1 11010001 С &#209;
210 322 0xD2 11010010 Т &#210;
211 323 0xD3 11010011 У &#211;
212 324 0xD4 11010100 Ф &#212;
213 325 0xD5 11010101 Х &#213;
214 326 0xD6 11010110 Ц &#214;
215 327 0xD7 11010111 Ч &#215;
216 330 0xD8 11011000 Ш &#216;
217 331 0xD9 11011001 Щ &#217;
218 332 0xDA 11011010 Ъ &#218;
219 333 0xDB 11011011 Ы &#219;
220 334 0xDC 11011100 Ь &#220;
221 335 0xDD 11011101 Э &#221;
222 336 0xDE 11011110 Ю &#222;
223 337 0xDF 11011111 Я &#223;
224 340 0xE0 11100000 а &#224;
225 341 0xE1 11100001 б &#225;
226 342 0xE2 11100010 в &#226;
227 343 0xE3 11100011 г &#227;
228 344 0xE4 11100100 д &#228;
229 345 0xE5 11100101 е &#229;
230 346 0xE6 11100110 ж &#230;
231 347 0xE7 11100111 з &#231;
232 350 0xE8 11101000 и &#232;
233 351 0xE9 11101001 й &#233;
234 352 0xEA 11101010 к &#234;
235 353 0xEB 11101011 л &#235;
236 354 0xEC 11101100 м &#236;
237 355 0xED 11101101 н &#237;
238 356 0xEE 11101110 о &#238;
239 357 0xEF 11101111 п &#239;
240 360 0xF0 11110000 р &#240;
241 361 0xF1 11110001 с &#241;
242 362 0xF2 11110010 т &#242;
243 363 0xF3 11110011 у &#243;
244 364 0xF4 11110100 ф &#244;
245 365 0xF5 11110101 х &#245;
246 366 0xF6 11110110 ц &#246;
247 367 0xF7 11110111 ч &#247;
248 370 0xF8 11111000 ш &#248;
249 371 0xF9 11111001 щ &#249;
250 372 0xFA 11111010 ъ &#250;
251 373 0xFB 11111011 ы &#251;
252 374 0xFC 11111100 ь &#252;
253 375 0xFD 11111101 э &#253;
254 376 0xFE 11111110 ю &#254;
255 377 0xFF 11111111 я &#255;

Windows-1251 (cp1251) — это стандартная 8-битная кодировка, разработанная компанией Microsoft. Она содержит практически все символы, которые Вы можете встретить на стандартной русской клавиатуре. Также 1251 имеет символы для таких языков, как белорусский, украинский, болгарский и сербский.

DEC

HEX

СИМВ

DEC

HEX

СИМВ

DEC

HEX

СИМВ

000

00

NOP

086

56

V

171

AB

«

001

01

SOH

087

57

W

172

AC

¬

002

02

STX

088

58

X

173

AD

003

03

ETX

089

59

Y

174

AE

®

004

04

EOT

090

5A

Z

175

AF

Ї

005

05

ENQ

091

5B

[

176

B0

°

006

06

ACK

092

5C

\

177

B1

±

007

07

BEL

093

5D

]

178

B2

І

008

08

BS

094

5E

^

179

B3

і

009

09

Табуляция

095

5F

_

180

B4

ґ

010

0A

LF

096

60

`

181

B5

µ

011

0B

VT

097

61

a

182

B6

012

0C

FF

098

62

b

183

B7

·

013

0D

CR

099

63

c

184

B8

Ё

014

0E

SO

100

64

d

185

B9

015

0F

SI

101

65

e

186

BA

Є

016

10

DLE

102

66

f

187

BB

»

017

11

DC1

103

67

g

188

BC

ј

018

12

DC2

104

68

h

189

BD

Ѕ

019

13

DC3

105

69

i

190

BE

Ѕ

020

14

DC4

106

6A

j

191

BF

Ї

021

15

NAK

107

6B

k

192

C0

А

022

16

SYN

108

6C

l

193

C1

Б

023

17

ETB

109

6D

m

194

C2

В

024

18

CAN

110

6E

n

195

C3

Г

025

19

EM

111

6F

o

196

C4

Д

026

1A

SUB

112

70

p

197

C5

Е

027

1B

ESC

113

71

q

198

C6

Ж

028

1C

FS

114

72

r

199

C7

З

029

1D

GS

115

73

s

200

C8

И

030

1E

RS

116

74

t

201

C9

Й

031

1F

US

117

75

u

202

CA

К

032

20

Пробел

118

76

v

203

CB

Л

033

21

!

119

77

w

204

CC

М

034

22

«

120

78

x

205

CD

Н

035

23

#

121

79

y

206

CE

О

036

24

$

122

7A

z

207

CF

П

037

25

%

123

7B

{

208

D0

Р

038

26

&

124

7C

|

209

D1

С

039

27

125

7D

}

210

D2

Т

040

28

(

126

7E

~

211

D3

У

041

29

)

127

7F



212

D4

Ф

042

2A

*

128

80

Ђ

213

D5

Х

043

2B

+

129

81

Ѓ

214

D6

Ц

044

2C

,

130

82

215

D7

Ч

045

2D

131

83

ѓ

216

D8

Ш

046

2E

.

132

84

217

D9

Щ

047

2F

/

133

85

218

DA

Ъ

048

30

0

134

86

219

DB

Ы

049

31

1

135

87

220

DC

Ь

050

32

2

136

88

221

DD

Э

051

33

3

137

89

222

DE

Ю

052

34

4

138

8A

Љ

223

DF

Я

053

35

5

139

8B

224

E0

а

054

36

6

140

8C

Њ

225

E1

б

055

37

7

141

8D

Ќ

226

E2

в

056

38

8

142

8E

Ћ

227

E3

г

057

39

9

143

8F

Џ

228

E4

д

058

3A

:

144

90

Ђ

229

E5

е

059

3B

;

145

91

230

E6

ж

060

3C

<

146

92

231

E7

з

061

3D

=

147

93

232

E8

и

062

3E

>

148

94

233

E9

й

063

3F

?

149

95

234

EA

к

064

40

@

150

96

235

EB

л

065

41

A

151

97

236

EC

м

066

42

B

152

98 ˜

237

ED

н

067

43

C

153

99

238

EE

о

068

44

D

154

9A

љ

239

EF

п

069

45

E

155

9B

240

F0

р

070

46

F

156

9C

њ

241

F1

с

071

47

G

157

9D

ќ

242

F2

т

072

48

H

158

9E

ћ

243

F3

у

073

49

I

159

9F

џ

244

F4

ф

074

4A

J

160

A0

245

F5

х

075

4B

K

161

A1

Ў

246

F6

ц

076

4C

L

162

A2

ў

247

F7

ч

077

4D

M

163

A3

Ј

248

F8

ш

078

4E

N

164

A4

¤

249

F9

щ

079

4F

O

165

A5

Ґ

250

FA

ъ

080

50

P

166

A6

¦

251

FB

ы

081

51

Q

167

A7

§

252

FC

ь

082

52

R

168

A8

Ё

253

FD

э

083

53

S

169

A9

©

254

FE

ю

084

54

T

170

AA

Є

255

FF

я

085

55

U

Таблица ASCII (American standard code for information interchange) является мировым стандартом для кодирования букв английского алфавита, популярных спец символов (! $ # % & и т.д.) и некоторых непечатных символов (например, возврат каретки 0x0D и перенос строки 0х0А).

Таблица создавалась те времена, когда возникла необходимость связать символы и числа. А такое соответствие необходимо было для того что бы с помощью чисел можно было передать текстовое сообщение между разными устройствами с цифровой связью.

Таблица CP1251 (windows-1251)

Эта кодировочная таблица может называться или CP1251 или Windows-1251 Это стандарт кодирования кириллических символов в операционных системах windows с русскоязычным интерфейсом.

Первая часть этой таблицы (до байта 0x7F) повторяет таблицу ASCII, а вторая часть (от 0x80 до 0xFF) кодирует кириллические символы в алфавитном порядке.

CP1251 (windows-1251)

Таблица IS0-8859-5

Эта кодировка применяется в дисплеях Nextion для кодирования кириллических символов.

Стоит обратить внимание, что в данной таблице кириллические символы расположены в алфавитном порядке и сдвинуты ровно на 16 байт по сравнению с кодировочной таблицей windows-1251.

Кодировка UTF-8
(Unicode Transformation Format)

Очень распространенный формат кодирования символов, позволяющий кодировать символы переменным количеством байт.

Например, если для кодирования номера символа требуется 21 бит, то используется 4 байта для кодировки. Если для кодирования достаточно 11 бит, то используют 2 байта. А если номер символа может быть закодирован 7 битами, то используется один байт.

Кодировка UTF-8

Все ASCII символы в кодировке UTF8 закодированы без изменений, то есть 1 байтом, как в стандартной таблице ASCII.

А вот остальные символы закодированы количеством байт от 2 до 4.

Кириллические символы закодированы двумя байтами.

Reference of Extended ASCII Table for Windows-1251

The ASCII table, when defined according to the Windows-1251 character encoding (also known as Code page 1251), includes ASCII control characters and ASCII printable characters. Moreover, it also includes the extended ASCII character set unique to Windows-1251. This character set is particularly designed to support Cyrillic languages.

ASCII control characters (character code 0-31)

The first 32 characters in the ASCII-table are unprintable control codes and are used to control peripherals such as printers.

DEC OCT HEX BIN Symbol HTML Number HTML Name Description
0 000 00 00000000 &#00;   Null character
1 001 01 00000001 &#01;   Start of Heading
2 002 02 00000010 &#02;   Start of Text
3 003 03 00000011 &#03;   End of Text
4 004 04 00000100 &#04;   End of Transmission
5 005 05 00000101 &#05;   Enquiry
6 006 06 00000110 &#06;   Acknowledge
7 007 07 00000111 &#07;   Bell, Alert
8 010 08 00001000 &#08;   Backspace
9 011 09 00001001 &#09;   Horizontal Tab
10 012 0A 00001010 &#10;   Line Feed
11 013 0B 00001011 &#11;   Vertical Tabulation
12 014 0C 00001100 &#12;   Form Feed
13 015 0D 00001101 &#13;   Carriage Return
14 016 0E 00001110 &#14;   Shift Out
15 017 0F 00001111 &#15;   Shift In
16 020 10 00010000 &#16;   Data Link Escape
17 021 11 00010001 &#17;   Device Control One (XON)
18 022 12 00010010 &#18;   Device Control Two
19 023 13 00010011 &#19;   Device Control Three (XOFF)
20 024 14 00010100 &#20;   Device Control Four
21 025 15 00010101 &#21;   Negative Acknowledge
22 026 16 00010110 &#22;   Synchronous Idle
23 027 17 00010111 &#23;   End of Transmission Block
24 030 18 00011000 &#24;   Cancel
25 031 19 00011001 &#25;   End of medium
26 032 1A 00011010 &#26;   Substitute
27 033 1B 00011011 &#27;   Escape
28 034 1C 00011100 &#28;   File Separator
29 035 1D 00011101 &#29;   Group Separator
30 036 1E 00011110 &#30;   Record Separator
31 037 1F 00011111 &#31;   Unit Separator

ASCII printable characters (character code 32-127)

Codes 32-127 are common for all the different variations of the ASCII table, they are called printable characters, represent letters, digits, punctuation marks, and a few miscellaneous symbols. You will find almost every character on your keyboard. Character 127 represents the command DEL.

DEC OCT HEX BIN Symbol HTML Number HTML Name Description
32 040 20 00100000 &#32;   Space
33 041 21 00100001 ! &#33; &excl; Exclamation mark
34 042 22 00100010 « &#34; &quot; Double quotes (or speech marks)
35 043 23 00100011 # &#35; &num; Number sign
36 044 24 00100100 $ &#36; &dollar; Dollar
37 045 25 00100101 % &#37; &percnt; Per cent sign
38 046 26 00100110 & &#38; &amp; Ampersand
39 047 27 00100111 &#39; &apos; Single quote
40 050 28 00101000 ( &#40; &lparen; Open parenthesis (or open bracket)
41 051 29 00101001 ) &#41; &rparen; Close parenthesis (or close bracket)
42 052 2A 00101010 * &#42; &ast; Asterisk
43 053 2B 00101011 + &#43; &plus; Plus
44 054 2C 00101100 , &#44; &comma; Comma
45 055 2D 00101101 &#45;   Hyphen-minus
46 056 2E 00101110 . &#46; &period; Period, dot or full stop
47 057 2F 00101111 / &#47; &sol; Slash or divide
48 060 30 00110000 0 &#48;   Zero
49 061 31 00110001 1 &#49;   One
50 062 32 00110010 2 &#50;   Two
51 063 33 00110011 3 &#51;   Three
52 064 34 00110100 4 &#52;   Four
53 065 35 00110101 5 &#53;   Five
54 066 36 00110110 6 &#54;   Six
55 067 37 00110111 7 &#55;   Seven
56 070 38 00111000 8 &#56;   Eight
57 071 39 00111001 9 &#57;   Nine
58 072 3A 00111010 : &#58; &colon; Colon
59 073 3B 00111011 ; &#59; &semi; Semicolon
60 074 3C 00111100 < &#60; &lt; Less than (or open angled bracket)
61 075 3D 00111101 = &#61; &equals; Equals
62 076 3E 00111110 > &#62; &gt; Greater than (or close angled bracket)
63 077 3F 00111111 ? &#63; &quest; Question mark
64 100 40 01000000 @ &#64; &commat; At sign
65 101 41 01000001 A &#65;   Uppercase A
66 102 42 01000010 B &#66;   Uppercase B
67 103 43 01000011 C &#67;   Uppercase C
68 104 44 01000100 D &#68;   Uppercase D
69 105 45 01000101 E &#69;   Uppercase E
70 106 46 01000110 F &#70;   Uppercase F
71 107 47 01000111 G &#71;   Uppercase G
72 110 48 01001000 H &#72;   Uppercase H
73 111 49 01001001 I &#73;   Uppercase I
74 112 4A 01001010 J &#74;   Uppercase J
75 113 4B 01001011 K &#75;   Uppercase K
76 114 4C 01001100 L &#76;   Uppercase L
77 115 4D 01001101 M &#77;   Uppercase M
78 116 4E 01001110 N &#78;   Uppercase N
79 117 4F 01001111 O &#79;   Uppercase O
80 120 50 01010000 P &#80;   Uppercase P
81 121 51 01010001 Q &#81;   Uppercase Q
82 122 52 01010010 R &#82;   Uppercase R
83 123 53 01010011 S &#83;   Uppercase S
84 124 54 01010100 T &#84;   Uppercase T
85 125 55 01010101 U &#85;   Uppercase U
86 126 56 01010110 V &#86;   Uppercase V
87 127 57 01010111 W &#87;   Uppercase W
88 130 58 01011000 X &#88;   Uppercase X
89 131 59 01011001 Y &#89;   Uppercase Y
90 132 5A 01011010 Z &#90;   Uppercase Z
91 133 5B 01011011 [ &#91; &lsqb; Opening bracket
92 134 5C 01011100 \ &#92; &bsol; Backslash
93 135 5D 01011101 ] &#93; &rsqb; Closing bracket
94 136 5E 01011110 ^ &#94; &Hat; Caret — circumflex
95 137 5F 01011111 _ &#95; &lowbar; Underscore
96 140 60 01100000 ` &#96; &grave; Grave accent
97 141 61 01100001 a &#97;   Lowercase a
98 142 62 01100010 b &#98;   Lowercase b
99 143 63 01100011 c &#99;   Lowercase c
100 144 64 01100100 d &#100;   Lowercase d
101 145 65 01100101 e &#101;   Lowercase e
102 146 66 01100110 f &#102;   Lowercase f
103 147 67 01100111 g &#103;   Lowercase g
104 150 68 01101000 h &#104;   Lowercase h
105 151 69 01101001 i &#105;   Lowercase i
106 152 6A 01101010 j &#106;   Lowercase j
107 153 6B 01101011 k &#107;   Lowercase k
108 154 6C 01101100 l &#108;   Lowercase l
109 155 6D 01101101 m &#109;   Lowercase m
110 156 6E 01101110 n &#110;   Lowercase n
111 157 6F 01101111 o &#111;   Lowercase o
112 160 70 01110000 p &#112;   Lowercase p
113 161 71 01110001 q &#113;   Lowercase q
114 162 72 01110010 r &#114;   Lowercase r
115 163 73 01110011 s &#115;   Lowercase s
116 164 74 01110100 t &#116;   Lowercase t
117 165 75 01110101 u &#117;   Lowercase u
118 166 76 01110110 v &#118;   Lowercase v
119 167 77 01110111 w &#119;   Lowercase w
120 170 78 01111000 x &#120;   Lowercase x
121 171 79 01111001 y &#121;   Lowercase y
122 172 7A 01111010 z &#122;   Lowercase z
123 173 7B 01111011 { &#123; &lcub; Opening brace
124 174 7C 01111100 | &#124; &verbar; Vertical bar
125 175 7D 01111101 } &#125; &rcub; Closing brace
126 176 7E 01111110 ~ &#126; &tilde; Equivalency sign — tilde
127 177 7F 01111111 &#127;   Delete

The extended ASCII codes (character code 128-255)

Windows-1251 is a character encoding standard used to represent text in the Cyrillic script. It was introduced by Microsoft in the Windows operating system and is based on ISO 8859-5. Windows-1251 supports a range of characters and symbols used in the Cyrillic script, including Russian, Bulgarian, Serbian, and others.

Windows-1251 is widely used in the former Soviet Union countries and other countries that use the Cyrillic script. It is commonly used in word processing software, spreadsheets, and databases. However, it is important to note that Windows-1251 may not provide full support for all of the characters used in these languages and may cause issues when dealing with text in certain scripts.

DEC OCT HEX BIN Symbol HTML Number HTML Name Description
128 200 80 10000000 Ђ &#1026; &DJcy; Cyrillic capital letter Dje
129 201 81 10000001 Ѓ &#1027; &GJcy; Cyrillic capital letter Gje
130 202 82 10000010 &#130; &sbquo; Single low-9 quotation mark
131 203 83 10000011 ѓ &#1107; &gjcy; Cyrillic small letter gje
132 204 84 10000100 &#132; &bdquo; Double low-9 quotation mark
133 205 85 10000101 &#133; &hellip; Horizontal ellipsis
134 206 86 10000110 &#134; &dagger; Dagger
135 207 87 10000111 &#135; &Dagger; Double dagger
136 210 88 10001000 &#8364; &euro; Euro sign
137 211 89 10001001 &#137; &permil; Per mille sign
138 212 8A 10001010 Љ &#1033; &LJcy; Cyrillic capital letter Lje
139 213 8B 10001011 &#139; &lsaquo; Single left-pointing angle quotation
140 214 8C 10001100 Њ &#1034; &NJcy; Cyrillic capital letter Nje
141 215 8D 10001101 Ќ &#1036; &KJcy; Cyrillic capital letter Kje
142 216 8E 10001110 Ћ &#1035; &TSHcy; Cyrillic capital letter Tshe
143 217 8F 10001111 Џ &#1039; &DZcy; Cyrillic capital letter Dzhe
144 220 90 10010000 ђ &#1106; &djcy; Cyrillic small letter dje
145 221 91 10010001 &#145; &lsquo; Left single quotation mark
146 222 92 10010010 &#146; &rsquo; Right single quotation mark
147 223 93 10010011 &#147; &ldquo; Left double quotation mark
148 224 94 10010100 &#148; &rdquo; Right double quotation mark
149 225 95 10010101 &#149; &bull; Bullet
150 226 96 10010110 &#150; &ndash; En dash
151 227 97 10010111 &#151; &mdash; Em dash
152 230 98 10011000   Unused
153 231 99 10011001 &#153; &trade; Trade mark sign
154 232 9A 10011010 љ &#1113; &ljcy; Cyrillic small letter lje
155 233 9B 10011011 &#155; &rsaquo; Single right-pointing angle quotation mark
156 234 9C 10011100 њ &#1114; &njcy; Cyrillic small letter nje
157 235 9D 10011101 ќ &#1116; &kjcy; Cyrillic small letter Kje
158 236 9E 10011110 ћ &#1115; &tshcy; Cyrillic small letter Tshe
159 237 9F 10011111 џ &#1119; &dzcy; Cyrillic small letter Dzhe
160 240 A0 10100000   &#160; &nbsp; Non-breaking space
161 241 A1 10100001 Ў &#1038; &Ubrcy; Cyrillic capital letter short U
162 242 A2 10100010 ў &#1118; &ubrcy; Cyrillic small letter short u
163 243 A3 10100011 Ј &#1032; &Jsercy; Cyrillic capital letter Je
164 244 A4 10100100 ¤ &#164; &curren; Currency sign
165 245 A5 10100101 Ґ &#1168;   Cyrillic capital letter Ghe with upturn
166 246 A6 10100110 ¦ &#166; &brvbar; Pipe, broken vertical bar
167 247 A7 10100111 § &#167; &sect; Section sign
168 250 A8 10101000 Ё &#1025; &IOcy; Cyrillic capital letter Io
169 251 A9 10101001 © &#169; &copy; Copyright sign
170 252 AA 10101010 Є &#1028; &Jukcy; Cyrillic capital letter Ukrainian Ie
171 253 AB 10101011 « &#171; &laquo; Left double angle quotes
172 254 AC 10101100 ¬ &#172; &not; Negation
173 255 AD 10101101 ­ &#173; &shy; Soft hyphen
174 256 AE 10101110 ® &#174; &reg; Registered trade mark sign
175 257 AF 10101111 Ї &#1031; &YIcy; Cyrillic capital letter Yi
176 260 B0 10110000 ° &#176; &deg; Degree sign
177 261 B1 10110001 ± &#177; &plusmn; Plus-or-minus sign
178 262 B2 10110010 І &#1030; &Iukcy; Cyrillic capital letter Byelorussian-Ukrainian I
179 263 B3 10110011 і &#1110; &iukcy; Cyrillic small letter Byelorussian-Ukrainian i
180 264 B4 10110100 ґ &#1169;   Cyrillic small letter ghe with upturn
181 265 B5 10110101 µ &#181; &micro; Micro sign
182 266 B6 10110110 &#182; &para; Pilcrow sign — paragraph sign
183 267 B7 10110111 · &#183; &middot; Middle dot — Georgian comma
184 270 B8 10111000 ё &#1105; &iocy; Cyrillic small letter io
185 271 B9 10111001 &#8470; &numero; Numero Sign
186 272 BA 10111010 є &#1108; &jukcy; Cyrillic small letter Ukrainian ie
187 273 BB 10111011 » &#187; &raquo; Right double angle quotes
188 274 BC 10111100 ј &#1112; &jsercy; Cyrillic small letter je
189 275 BD 10111101 Ѕ &#1029; &DScy; Cyrillic capital letter Dze
190 276 BE 10111110 ѕ &#1109; &dscy; Cyrillic small letter dze
191 277 BF 10111111 ї &#1111; &yicy; Cyrillic small letter yi
192 300 C0 11000000 А &#1040; &Acy; Cyrillic capital letter A
193 301 C1 11000001 Б &#1041; &Bcy; Cyrillic capital letter Be
194 302 C2 11000010 В &#1042; &Vcy; Cyrillic capital letter Ve
195 303 C3 11000011 Г &#1043; &Gcy; Cyrillic capital letter Ghe
196 304 C4 11000100 Д &#1044; &Dcy; Cyrillic capital letter De
197 305 C5 11000101 Е &#1045; &IEcy; Cyrillic capital letter Ie
198 306 C6 11000110 Ж &#1046; &ZHcy; Cyrillic capital letter Zhe
199 307 C7 11000111 З &#1047; &Zcy; Cyrillic capital letter Ze
200 310 C8 11001000 И &#1048; &Icy; Cyrillic capital letter I
201 311 C9 11001001 Й &#1049; &Jcy; Cyrillic capital letter Short I
202 312 CA 11001010 К &#1050; &Kcy; Cyrillic capital letter Ka
203 313 CB 11001011 Л &#1051; &Lcy; Cyrillic capital letter El
204 314 CC 11001100 М &#1052; &Mcy; Cyrillic capital letter Em
205 315 CD 11001101 Н &#1053; &Ncy; Cyrillic capital letter En
206 316 CE 11001110 О &#1054; &Ocy; Cyrillic capital letter O
207 317 CF 11001111 П &#1055; &Pcy; Cyrillic capital letter Pe
208 320 D0 11010000 Р &#1056; &Rcy; Cyrillic capital letter Er
209 321 D1 11010001 С &#1057; &Scy; Cyrillic capital letter Es
210 322 D2 11010010 Т &#1058; &Tcy; Cyrillic capital letter Te
211 323 D3 11010011 У &#1059; &Ucy; Cyrillic capital letter U
212 324 D4 11010100 Ф &#1060; &Fcy; Cyrillic capital letter Ef
213 325 D5 11010101 Х &#1061; &KHcy; Cyrillic capital letter Ha
214 326 D6 11010110 Ц &#1062; &TScy; Cyrillic capital letter Tse
215 327 D7 11010111 Ч &#1063; &CHcy; Cyrillic capital letter Che
216 330 D8 11011000 Ш &#1064; &SHcy; Cyrillic capital letter Sha
217 331 D9 11011001 Щ &#1065; &SHCHcy; Cyrillic capital letter Shcha
218 332 DA 11011010 Ъ &#1066; &HARDcy; Cyrillic capital letter Hard Sign
219 333 DB 11011011 Ы &#1067; &Ycy; Cyrillic capital letter Yeru
220 334 DC 11011100 Ь &#1068; &SOFTcy; Cyrillic capital letter Soft Sign
221 335 DD 11011101 Э &#1069; &Ecy; Cyrillic capital letter E
222 336 DE 11011110 Ю &#1070; &YUcy; Cyrillic capital letter Yu
223 337 DF 11011111 Я &#1071; &YAcy; Cyrillic capital letter Ya
224 340 E0 11100000 а &#1072; &acy; Cyrillic Small Letter A
225 341 E1 11100001 б &#1073; &bcy; Cyrillic small letter be
226 342 E2 11100010 в &#1074; &vcy; Cyrillic small letter ve
227 343 E3 11100011 г &#1075; &gcy; Cyrillic small letter ghe
228 344 E4 11100100 д &#1076; &dcy; Cyrillic small letter de
229 345 E5 11100101 е &#1077; &iecy; Cyrillic small letter ie
230 346 E6 11100110 ж &#1078; &zhcy; Cyrillic small letter zhe
231 347 E7 11100111 з &#1079; &zcy; Cyrillic small letter ze
232 350 E8 11101000 и &#1080; &icy; Cyrillic small letter i
233 351 E9 11101001 й &#1081; &jcy; Cyrillic small letter short i
234 352 EA 11101010 к &#1082; &kcy; Cyrillic small letter ka
235 353 EB 11101011 л &#1083; &lcy; Cyrillic small letter el
236 354 EC 11101100 м &#1084; &mcy; Cyrillic small letter em
237 355 ED 11101101 н &#1085; &ncy; Cyrillic small letter en
238 356 EE 11101110 о &#1086; &ocy; Cyrillic small letter o
239 357 EF 11101111 п &#1087; &pcy; Cyrillic small letter pe
240 360 F0 11110000 р &#1088; &rcy; Cyrillic small letter er
241 361 F1 11110001 с &#1089; &scy; Cyrillic small letter es
242 362 F2 11110010 т &#1090; &tcy; Cyrillic small letter te
243 363 F3 11110011 у &#1091; &ucy; Cyrillic small letter u
244 364 F4 11110100 ф &#1092; &fcy; Cyrillic small letter ef
245 365 F5 11110101 х &#1093; &khcy; Cyrillic small letter ha
246 366 F6 11110110 ц &#1094; &tscy; Cyrillic small letter tse
247 367 F7 11110111 ч &#1095; &chcy; Cyrillic small letter che
248 370 F8 11111000 ш &#1096; &shcy; Cyrillic small letter sha
249 371 F9 11111001 щ &#1097; &shchcy; Cyrillic small letter shcha
250 372 FA 11111010 ъ &#1098; &hardcy; Cyrillic small letter hard sign
251 373 FB 11111011 ы &#1099; &ycy; Cyrillic small letter yeru
252 374 FC 11111100 ь &#1100; &softcy; Cyrillic small letter soft sign
253 375 FD 11111101 э &#1101; &ecy; Cyrillic small letter e
254 376 FE 11111110 ю &#1102; &yucy; Cyrillic small letter yu
255 377 FF 11111111 я &#1103; &yacy; Cyrillic small letter ya

Как работают кодировки текста. Откуда появляются «кракозябры». Принципы кодирования. Обобщение и детальный разбор

Время на прочтение
10 мин

Количество просмотров 104K

Данная статья имеет цель собрать воедино и разобрать принципы и механизм работы кодировок текста, подробно этот механизм разобрать и объяснить. Полезна она будет тем, кто только примерно представляет, что такое кодировки текста и как они работают, чем отличаются друг от друга, почему иногда появляются не читаемые символы, какой принцип кодирования имеют разные кодировки.

Чтобы получить детальное понимание этого вопроса придется прочитать и свести воедино не одну статью и потратить довольно значительное время на это. В данном материале же это все собрано воедино и по идее должно сэкономить время и разбор на мой взгляд получился довольно подробный.

О чем будет под катом: принцип работы одно байтовых кодировок (ASCII, Windows-1251 и т.д.), предпосылки появления Unicode, что такое Unicode, Unicode-кодировки UTF-8, UTF-16, их отличия, принципиальные особенности, совместимость и несовместимость разных кодировок, принципы кодирования символов, практический разбор кодирования и декодирования.

Вопрос с кодировками сейчас конечно уже потерял актуальность, но все же знать как они работают сейчас и как работали раньше и при этом не потратить много времени на это думаю лишним не будет.

Предпосылки Unicode

Начать думаю стоит с того времени когда компьютеризация еще не была так сильно развита и только набирала обороты. Тогда разработчики и стандартизаторы еще не думали, что компьютеры и интернет наберут такую огромную популярность и распространенность. Собственно тогда то и возникла потребность в кодировке текста. В каком то же виде нужно было хранить буквы в компьютере, а он (компьютер) только единицы и нули понимает. Так была разработана одно-байтовая кодировка ASCII (скорее всего она не первая кодировка, но она наиболее распространенная и показательная, по этому ее будем считать за эталонную). Что она из себя представляет? Каждый символ в этой кодировке закодирован 8-ю битами. Несложно посчитать что исходя из этого кодировка может содержать 256 символов (восемь бит, нулей или единиц 28=256).

Первые 7 бит (128 символов 27=128) в этой кодировке были отданы под символы латинского алфавита, управляющие символы (такие как переносы строк, табуляция и т.д.) и грамматические символы. Остальные отводились под национальные языки. То есть получилось что первые 128 символов всегда одинаковые, а если хочешь закодировать свой родной язык пожалуйста, используй оставшуюся емкость. Собственно так и появился огромный зоопарк национальных кодировок. И теперь сами можете представить, вот например я находясь в России беру и создаю текстовый документ, у меня по умолчанию он создается в кодировке Windows-1251 (русская кодировка использующаяся в ОС Windows) и отсылаю его кому то, например в США. Даже то что мой собеседник знает русский язык, ему не поможет, потому что открыв мой документ на своем компьютере (в редакторе с дефолтной кодировкой той же самой ASCII) он увидит не русские буквы, а кракозябры. Если быть точнее, то те места в документе которые я напишу на английском отобразятся без проблем, потому что первые 128 символов кодировок Windows-1251 и ASCII одинаковые, но вот там где я написал русский текст, если он в своем редакторе не укажет правильную кодировку будут в виде кракозябр.

Думаю проблема с национальными кодировками понятна. Собственно этих национальных кодировок стало очень много, а интернет стал очень широким, и в нем каждый хотел писать на своем языке и не хотел чтобы его язык выглядел как кракозябры. Было два выхода, указывать для каждой страницы кодировки, либо создать одну общую для всех символов в мире таблицу символов. Победил второй вариант, так создали Unicode таблицу символов.

Небольшой практикум ASCII

Возможно покажется элементарщиной, но раз уж решил объяснять все и подробно, то это надо.

Вот таблица символов ASCII:

Тут имеем 3 колонки:

  • номер символа в десятичном формате
  • номер символа в шестнадцатиричном формате
  • представление самого символа.

Итак, закодируем строку «ok» (англ.) в кодировке ASCII. Символ «o» (англ.) имеет позицию 111 в десятичном виде и 6F в шестнадцатиричном. Переведем это в двоичную систему — 01101111. Символ «k» (англ.) — позиция 107 в десятеричной и 6B в шестнадцатиричной, переводим в двоичную — 01101011. Итого строка «ok» закодированная в ASCII будет выглядеть так — 01101111 01101011. Процесс декодирования будет обратный. Берем по 8 бит, переводим их в 10-ичную кодировку, получаем номер символа, смотрим по таблице что это за символ.

Unicode

С предпосылками создания общей таблицы для всех в мире символов, разобрались. Теперь собственно, к самой таблице. Unicode — именно эта таблица и есть (это не кодировка, а именно таблица символов). Она состоит из 1 114 112 позиций. Большинство этих позиций пока не заполнены символами, так что вряд ли понадобится это пространство расширять.

Разделено это общее пространство на 17 блоков, по 65 536 символов в каждом. Каждый блок содержит свою группу символов. Нулевой блок — базовый, там собраны наиболее употребляемые символы всех современных алфавитов. Во втором блоке находятся символы вымерших языков. Есть два блока отведенные под частное использование. Большинство блоков пока не заполнены.

Итого емкость символов юникода составляет от 0 до 10FFFF (в шестнадцатиричном виде).

Записываются символы в шестнадцатиричном виде с приставкой «U+». Например первый базовый блок включает в себя символы от U+0000 до U+FFFF (от 0 до 65 535), а последний семнадцатый блок от U+100000 до U+10FFFF (от 1 048 576 до 1 114 111).

Отлично теперь вместо зоопарка национальных кодировок, у нас есть всеобъемлющая таблица, в которой зашифрованы все символы которые нам могут пригодиться. Но тут тоже есть свои недостатки. Если раньше каждый символ был закодирован одним байтом, то теперь он может быть закодирован разным количеством байтов. Например для кодирования всех символов английского алфавита по прежнему достаточно одного байта например тот же символ «o» (англ.) имеет в юникоде номер U+006F, то есть тот же самый номер как и в ASCII — 6F в шестнадцатиричной и 111 в десятеричной. А вот для кодирования символа «U+103D5» (это древнеперсидская цифра сто) — 103D5 в шестнадцатиричной и 66 517 в десятеричной, тут нам потребуется уже три байта.

Решить эту проблему уже должны юникод-кодировки, такие как UTF-8 и UTF-16. Далее речь пойдет про них.

UTF-8

UTF-8 является юникод-кодировкой переменной длинны, с помощью которой можно представить любой символ юникода.

Давайте поподробнее про переменную длину, что это значит? Первым делом надо сказать, что структурной (атомарной) единицей этой кодировки является байт. То что кодировка переменной длинны, значит, что один символ может быть закодирован разным количеством структурных единиц кодировки, то есть разным количеством байтов. Так например латиница кодируется одним байтом, а кириллица двумя байтами.

Немного отступлю от темы, надо написать про совместимость ASCII и UTF

То что латинские символы и основные управляющие конструкции, такие как переносы строк, табуляции и т.д. закодированы одним байтом делает utf-кодировки совместимыми с кодировками ASCII. То есть фактически латиница и управляющие конструкции находятся на тех же самых местах как в ASCII, так и в UTF, и то что закодированы они и там и там одним байтом и обеспечивает эту совместимость.

Давайте возьмем символ «o»(англ.) из примера про ASCII выше. Помним что в таблице ASCII символов он находится на 111 позиции, в битовом виде это будет 01101111. В таблице юникода этот символ — U+006F что в битовом виде тоже будет 01101111. И теперь так, как UTF — это кодировка переменной длины, то в ней этот символ будет закодирован одним байтом. То есть представление данного символа в обеих кодировках будет одинаково. И так для всего диапазона символов от 0 до 128. То есть если ваш документ состоит из английского текста то вы не заметите разницы если откроете его и в кодировке UTF-8 и UTF-16 и ASCII (прим. в UTF-16 такие символы все равно будут закодированы двумя байтами, по этому вы не увидите разницы, если ваш редактор будет игнорировать нулевые байты), и так до момента пока вы не начнете работать с национальным алфавитом.

Сравним на практике как будет выглядеть фраза «Hello мир» в трех разных кодировках: Windows-1251 (русская кодировка), ISO-8859-1 (кодировка западно-европейских языков), UTF-8 (юникод-кодировка). Суть данного примера состоит в том что фраза написана на двух языках. Посмотрим как она будет выглядеть в разных кодировках.


В кодировке ISO-8859-1 нет таких символов «м», «и» и «р».

Теперь давайте поработаем с кодировками и разберемся как преобразовать строку из одной кодировки в другую и что будет если преобразование неправильное, или его нельзя осуществить из за разницы в кодировках.

Будем считать что изначально фраза была записана в кодировке Windows-1251. Исходя из таблицы выше запишем эту фразу в двоичном виде, в кодировке Windows-1251. Для этого нам потребуется всего только перевести из десятеричной или шестнадцатиричной системы (из таблицы выше) символы в двоичную.

01001000 01100101 01101100 01101100 01101111 00100000 11101100 11101000 11110000
Отлично, вот это и есть фраза «Hello мир» в кодировке Windows-1251.

Теперь представим что вы имеете файл с текстом, но не знаете в какой кодировке этот текст. Вы предполагаете что он в кодировке ISO-8859-1 и открываете его в своем редакторе в этой кодировке. Как сказано выше с частью символов все в порядке, они есть в этой кодировке, и даже находятся на тех же местах, но вот с символами из слова «мир» все сложнее. Этих символов в этой кодировке нет, а на их местах в кодировке ISO-8859-1 находятся совершенно другие символы. А конкретно «м» — позиция 236, «и» — 232. «р» — 240. И на этих позициях в кодировке ISO-8859-1 находятся следующие символы позиция 236 — символ «ì», 232 — «è», 240 — «ð»

Значит фраза «Hello мир» закодированная в Windows-1251 и открытая в кодировке ISO-8859-1 будет выглядеть так: «Hello ìèð». Вот и получается что эти две кодировки совместимы лишь частично, и корректно перекодировать строку из одной кодировке в другую не получится, потому что там просто напросто нет таких символов.

Тут и будут необходимы юникод-кодировки, а конкретно в данном случае рассмотрим UTF-8. То что символы в ней могут быть закодированы разным количеством байтов от 1 до 4 мы уже выяснили. Теперь стоит сказать что с помощью UTF могут быть закодированы не только 256 символов, как в двух предыдущих, а вобще все символы юникода

Работает она следующим образом. Первый бит каждого байта кодирующего символ отвечает не за сам символ, а за определение байта. То есть например если ведущий (первый) бит нулевой, то это значит что для кодирования символа используется всего один байт. Что и обеспечивает совместимость с ASCII. Если внимательно посмотрите на таблицу символов ASCII то увидите что первые 128 символов (английский алфавит, управляющие символы и знаки препинания) если их привести к двоичному виду, все начинаются с нулевого бита (будьте внимательны, если будете переводить символы в двоичную систему с помощью например онлайн конвертера, то первый нулевой ведущий бит может быть отброшен, что может сбить с толку).

01001000 — первый бит ноль, значит 1 байт кодирует 1 символ -> «H»

01100101 — первый бит ноль, значит 1 байт кодирует 1 символ -> «e»

Если первый бит не нулевой то символ кодируется несколькими байтами.

Для двухбайтовых символов первые три бита должны быть такие — 110

11010000 10111100 — в начале 110, значит 2 байта кодируют 1 символ. Второй байт в таком случае всегда начинается с 10. Итого отбрасываем управляющие биты (начальные, которые выделены красным и зеленым) и берем все оставшиеся (10000111100), переводим их в шестнадцатиричный вид (043С) -> U+043C в юникоде равно символ «м».

для трех-байтовых символов в первом байте ведущие биты — 1110

11101000 10000111 101010101 — суммируем все кроме управляющих битов и получаем что в 16-ричной равно 103В5, U+103D5 — древнеперситдская цифра сто (10000001111010101)

для четырех-байтовых символов в первом байте ведущие биты — 11110

11110100 10001111 10111111 10111111 — U+10FFFF это последний допустимый символ в таблице юникода (100001111111111111111)

Теперь, при желании, можем записать нашу фразу в кодировке UTF-8.

UTF-16

UTF-16 также является кодировкой переменной длинны. Главное ее отличие от UTF-8 состоит в том что структурной единицей в ней является не один а два байта. То есть в кодировке UTF-16 любой символ юникода может быть закодирован либо двумя, либо четырьмя байтами. Давайте для понятности в дальнейшем пару таких байтов я буду называть кодовой парой. Исходя из этого любой символ юникода в кодировке UTF-16 может быть закодирован либо одной кодовой парой, либо двумя.

Начнем с символов которые кодируются одной кодовой парой. Легко посчитать что таких символов может быть 65 535 (2в16), что полностью совпадает с базовым блоком юникода. Все символы находящиеся в этом блоке юникода в кодировке UTF-16 будут закодированы одной кодовой парой (двумя байтами), тут все просто.

символ «o» (латиница) — 00000000 01101111
символ «M» (кириллица) — 00000100 00011100

Теперь рассмотрим символы за пределами базового юникод диапазона. Для их кодирования потребуется уже две кодовые пары (4 байта). И механизм их кодирования немного сложнее, давайте по порядку.

Для начала введем понятия суррогатной пары. Суррогатная пара — это две кодовые пары используемые для кодирования одного символа (итого 4 байта). Для таких суррогатных пар в таблице юникода отведен специальный диапазон от D800 до DFFF. Это значит, что при преобразовании кодовой пары из байтового вида в шестнадцатиричный вы получаете число из этого диапазона, то перед вами не самостоятельный символ, а суррогатная пара.

Чтобы закодировать символ из диапазона 1000010FFFF (то есть символ для которого нужно использовать более одной кодовой пары) нужно:

  1. из кода символа вычесть 10000(шестнадцатиричное) (это наименьшее число из диапазона 1000010FFFF)
  2. в результате первого пункта будет получено число не больше FFFFF, занимающее до 20 бит
  3. ведущие 10 бит из полученного числа суммируются с D800 (начало диапазона суррогатных пар в юникоде)
  4. следующие 10 бит суммируются с DC00 (тоже число из диапазона суррогатных пар)
  5. после этого получатся 2 суррогатные пары по 16 бит, первые 6 бит в каждой такой паре отвечают за определение того что это суррогат,
  6. десятый бит в каждом суррогате отвечает за его порядок если это 1 то это первый суррогат, если 0, то второй

Разберем это на практике, думаю станет понятнее.

Для примера зашифруем символ, а потом расшифруем. Возьмем древнеперсидскую цифру сто (U+103D5):

  1. 103D510000 = 3D5
  2. 3D5 = 0000000000 1111010101 (ведущие 10 бит получились нулевые приведем это к шестнадцатиричному числу, получим 0 (первые десять), 3D5 (вторые десять))
  3. 0 + D800 = D800 (1101100000000000) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) нулевой, значит это первый суррогат
  4. 3D5 + DC00 = DFD5 (1101111111010101) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) единица, значит это второй суррогат
  5. итого данный символ в UTF-16 — 1101100000000000 1101111111010101

Теперь наоборот раскодируем. Допустим что у нас есть вот такой код — 1101100000100010 1101111010001000:

  1. переведем в шестнадцатиричный вид = D822 DE88 (оба значения из диапазона суррогатных пар, значит перед нами суррогатная пара)
  2. 1101100000100010 — десятый бит (справа) нулевой, значит первый суррогат
  3. 1101111010001000 — десятый бит (справа) единица, значит второй суррогат
  4. отбрасываем по 6 бит отвечающих за определение суррогата, получим 0000100010 1010001000 (8A88)
  5. прибавляем 10000 (меньшее число суррогатного диапазона) 8A88 + 10000 = 18A88
  6. смотрим в таблице юникода символ U+18A88 = Tangut Component-649. Компоненты тангутского письма.

Спасибо тем кто смог дочитать до конца, надеюсь было полезно и не очень занудно.

Вот некоторые интересные ссылки по данной теме:
habr.com/ru/post/158895 — полезные общие сведения по кодировкам
habr.com/ru/post/312642 — про юникод
unicode-table.com/ru — сама таблица юникод символов

Ну и собственно куда же без нее
ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 — юникод
ru.wikipedia.org/wiki/ASCII — ASCII
ru.wikipedia.org/wiki/UTF-8 — UTF-8
ru.wikipedia.org/wiki/UTF-16 — UTF-16

Содержание

  • 1 Представление символов в вычислительных машинах
  • 2 Таблицы кодировок
  • 3 Кодировки стандарта ASCII
    • 3.1 Структурные свойства таблицы
  • 4 Кодировки стандарта UNICODE
    • 4.1 Кодовое пространство
    • 4.2 Модифицирующие символы
    • 4.3 Способы представления
    • 4.4 UTF-8
      • 4.4.1 Принцип кодирования
        • 4.4.1.1 Правила записи кода одного символа в UTF-8
        • 4.4.1.2 Определение длины кода в UTF-8
    • 4.5 UTF-16
      • 4.5.1 UTF-16LE и UTF-16BE
    • 4.6 UTF-32
    • 4.7 Порядок байт
      • 4.7.1 Варианты записи
        • 4.7.1.1 Порядок от старшего к младшему
        • 4.7.1.2 Порядок от младшего к старшему
        • 4.7.1.3 Переключаемый порядок
        • 4.7.1.4 Смешанный порядок
        • 4.7.1.5 Различия
      • 4.7.2 Маркер последовательности байт
    • 4.8 Проблемы Юникода
  • 5 Примеры
    • 5.1 Код на python
    • 5.2 hex-дамп файла exampleBOM
  • 6 См. также
  • 7 Источники информации

Представление символов в вычислительных машинах

В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей бит (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.

Количество символов, которые можно задать последовательностью бит длины , задается простой формулой . Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.

Таблицы кодировок

На заре компьютерной эры на каждый символ было отведено по пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти символа входили только управляющие символы и строчные буквы английского алфавита.

С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов.
Первой семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания.
Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение символов: основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.

Но для многих языков (например, арабского, японского, китайского) символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.

Кодировки стандарта ASCII

Определение:
ASCII — таблицы кодировок, в которых содержатся основные символы (английский алфавит, цифры, знаки препинания, символы национальных алфавитов(свои для каждого региона), служебные символы) и длина кода каждого символа бит.

бит:

  • ASCII7 — первая кодировка, пригодная для работы с текстом. Помимо маленьких букв английского алфавита и служебных символов, содержит большие буквы английского языка, цифры, знаки препинания и другие символы.

Кодировки стандарта ASCII ( бит):

  • ASCII — первая кодировка, в которой стало возможно использовать символы национальных алфавитов.
  • КОИ8-R — первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы так, чтобы позиции кириллических символов соответствовали их фонетическим аналогам в английском алфавите. Это значит, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается «читаемым».
  • CP866 — русская кодировка, использовавшаяся на компьютерах IBM в системе DOS.
  • Windows-1251 — русская кодировка, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90-х годов. Кириллические символы идут в алфавитном порядке. Содержит все символы, встречающиеся в типографике обычного текста (кроме знака ударения).

Структурные свойства таблицы

  • Цифры 0-9 представляются своими двоичными значениями (например, ), перед которыми стоит . Таким образом, двоично-десятичные числа (BCD) превращаются в ASCII-строку с помощью простого добавления слева к каждому двоично-десятичному полубайту.
  • Буквы A-Z верхнего и нижнего регистров различаются в своём представлении только одним битом, что упрощает преобразование регистра и проверку на диапазон. Буквы представляются своими порядковыми номерами в алфавите, записанными в двоичной системе счисления, перед которыми стоит (для букв верхнего регистра) или (для букв нижнего регистра).
  0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI
1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2    ! » # $  % & ( ) * + , . /
3 0 1 2 3 4 5 6 7 8 9  :  ; < = >  ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~ DEL

Кодировки стандарта UNICODE

Юникод или Уникод (англ. Unicode) — это промышленный стандарт обеспечивающий цифровое представление символов всех письменностей мира, и специальных символов.

Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей.
Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа.Семейство кодировок определяет машинное представление последовательности кодов UCS.

Коды в стандарте Unicode разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F. Часть кодов зарезервирована для использования в будущем.

Кодовое пространство

Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до кодовых позиций, было принято решение использовать лишь для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0 используется чуть менее кодовых позиций ( графических и прочих символов).

Кодовое пространство разбито на плоскостей (англ. planes) по символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая — для для редко используемых иероглифов китайского письма, третья зарезервирована для архаичных китайских иероглифов. Плоскости и выделены для частного употребления.

Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов ) или «U+xxxxx» (для кодов ) или «U+xxxxxx» (для кодов ), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код .

Плоскости Юникода
Плоскость Название Диапазон символов
Plane 0 Basic multilingual plane (BMP) U+0000…U+​FFFF
Plane 1 Supplementary multilingual plane (SMP) U+10000…U+​1FFFF
Plane 2 Supplementary ideographic plane (SIP) U+20000…U+​2FFFF
Planes 3-13 Unassigned U+30000…U+​DFFFF
Plane 14 Supplement­ary special-purpose plane (SSP) U+E0000…U+​EFFFF
Planes 15-16 Supplement­ary private use area (S PUA A/B) U+F0000…U+​10FFFF

Модифицирующие символы

Ji.png

Графические символы в Юникоде делятся на протяжённые и непротяжённые. Непротяжённые символы при отображении не занимают дополнительного места в строке. К примеру, к ним относятся знак ударения. Протяжённые и непротяжённые символы имеют собственные коды, но последние не могут встречаться самостоятельно. Протяжённые символы называются базовыми (англ. base characters), а непротяженные — модифицирующими (англ. combining characters). Например символ «Й» (U+0419) может быть представлен в виде базового символа «И» (U+0418) и модифицирующего символа « ̆» (U+0306).

Способы представления

Юникод имеет несколько форм представления (англ. Unicode Transformation Format, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт.

UTF-8

UTF-8 — представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими -битные символы. Текст, состоящий только из символов с номером меньше , при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от двух до шести байт (на деле, только до четырех байт, поскольку в Юникоде нет символов с кодом больше , и вводить их в будущем не планируется), в которых первый байт всегда имеет вид , а остальные — .

Символы UTF-8 получаются из Unicode cледующим образом:

Unicode UTF-8 Представленные символы
0x00000000 — 0x0000007F 0xxxxxxx ASCII, в том числе английский алфавит, простейшие знаки препинания и арабские цифры
0x00000080 — 0x000007FF 110xxxxx 10xxxxxx кириллица, расширенная латиница, арабский алфавит, армянский алфавит, греческий алфавит, еврейский алфавит и коптский алфавит; сирийское письмо, тана, нко; Международный фонетический алфавит; некоторые знаки препинания
0x00000800 — 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
0x00010000 — 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx музыкальные символы, редкие китайские иероглифы, вымершие формы письменности
111111xx служебные символы c, d, e, f

Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы, называемые overlong sequence, отвергаются по соображениям безопасности.

Принцип кодирования

Правила записи кода одного символа в UTF-8

1. Если размер символа в кодировке UTF-8 = байт

Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;

2. Если размер символа в кодировке в UTF-8 байт (то есть от до ):

2.1 Первый байт содержит количество байт символа, закодированное в единичной системе счисления;
2 — 11
3 — 111
4 — 1111
5 — 1111 1
6 — 1111 11
2.2 «0» — бит терминатор, означающий завершение кода размера
2.3 далее идут значащие байты кода, которые имеют вид (10xx xxxx), где «10» — биты признака продолжения, а «x» — значащие биты.

В общем случае варианты представления одного символа в кодировке UTF-8 выглядят так:

(1 байт)  0aaa aaaa 
(2 байта) 110x xxxx 10xx xxxx
(3 байта) 1110 xxxx 10xx xxxx 10xx xxxx
(4 байта) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
(5 байт)  1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx
(6 байт)  1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx
Определение длины кода в UTF-8
Количество байт UTF-8 Количество значащих бит

В общем случае количество значащих бит , кодируемых байтами UTF-8, определяется по формуле:

при

при

UTF-16

UTF-16 — один из способов кодирования символов (англ. code point) из Unicode в виде последовательности -битных слов (англ. code unit). Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством ), причем -байтные символы представляются как есть, а более длинные — с помощью суррогатных пар (англ. surrogate pair), для которых и вырезан диапазон .

В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от до ). При этом можно кодировать символы Unicode в диапазонах и . Исключенный отсюда диапазон используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя -битными словами. Символы Unicode до включительно (исключая диапазон для суррогатов) записываются как есть -битным словом. Символы же в диапазоне (больше бит) уже кодируются парой -битных слов. Для этого их код арифметически сдвигается до нуля (из него вычитается минимальное число ). В результате получится значение от нуля до , которое занимает до бит. Старшие бит этого значения идут в лидирующее (первое) слово, а младшие бит — в последующее (второе). При этом в обоих словах старшие бит используются для обозначения суррогата. Биты с по имеют значения , а -й бит содержит у лидирующего слова и — у последующего. В связи с этим можно легко определить к чему относится каждое слово.

UTF-16LE и UTF-16BE

Один символ кодировки UTF-16 представлен последовательностью двух байт или двух пар байт. Который из двух байт в словах идёт впереди, старший или младший, зависит от порядка байт. Подробнее об этом будет сказано ниже.

UTF-32

UTF-32 — один из способов кодирования символов из Юникод, использующий для кодирования любого символа ровно бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байт. Символ UTF-32 является прямым представлением его кодовой позиции (англ. code point).

Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод непосредственно индексируемы. Получение -ой кодовой позиции является операцией, занимающей одинаковое время. Напротив, коды с переменной длиной требует последовательного доступа к -ой кодовой позиции. Это делает замену символов в строках UTF-32 простой, для этого используется целое число в качестве индекса, как обычно делается для строк ASCII.

Главный недостаток UTF-32 — это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства не оправдано.

Хотя использование неменяющегося числа байт на символ удобно, но не настолько, как кажется. Операция усечения строк реализуется легче в сравнении с UTF-8 и UTF-16. Но это не делает более быстрым нахождение конкретного смещения в строке, так как смещение может вычисляться и для кодировок фиксированного размера. Это не облегчает вычисление отображаемой ширины строки, за исключением ограниченного числа случаев, так как даже символ «фиксированной ширины» может быть получен комбинированием обычного символа с модифицирующим, который не имеет ширины. Например, буква «й» может быть получена из буквы «и» и диакритического знака «крючок над буквой». Сочетание таких знаков означает, что текстовые редакторы не могут рассматривать -битный код как единицу редактирования. Редакторы, которые ограничиваются работой с языками с письмом слева направо и составными символами (англ. Precomposed character), могут использовать символы фиксированного размера. Но такие редакторы вряд ли поддержат символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства и вряд ли смогут работать одинаково хорошо с символами UTF-16.

Порядок байт

В современной вычислительной технике и цифровых системах связи информация обычно представлена в виде последовательности байт. В том случае, если число не может быть представлено одним байтом, имеет значение в каком порядке байты записываются в памяти компьютера или передаются по линиям связи. Часто выбор порядка записи байт произволен и определяется только соглашениями.

В общем случае, для представления числа , большего (здесь — максимальное целое число, записываемое одним байтом), приходится использовать несколько байт. При этом число записывается в позиционной системе счисления по основанию :

Набор целых чисел , каждое из которых лежит в интервале от до , является последовательностью байт, составляющих . При этом называется младшим байтом, а — старшим байтом числа .

Варианты записи

Порядок от старшего к младшему

Порядок от старшего к младшему (англ. big-endian): , запись начинается со старшего и заканчивается младшим. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому, порядок байт от старшего к младшему часто называют сетевым порядком байт (англ. network byte order). Этот порядок байт используется процессорами IBM 360/370/390, Motorola 68000, SPARC (отсюда третье название — порядок байт Motorola, Motorola byte order).

В этом же виде (используя представление в десятичной системе счисления) записываются числа индийско-арабскими цифрами в письменностях с порядком знаков слева направо (латиница, кириллица). Для письменностей с обратным порядком (арабская) та же запись числа воспринимается как «от младшего к старшему».

Порядок байт от старшего к младшему применяется во многих форматах файлов — например, PNG, FLV, EBML.

Порядок от младшего к старшему

Порядок от младшего к старшему (англ. little-endian): , запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем иногда его называют интеловский порядок байт (по названию фирмы-создателя архитектуры x86).

В противоположность порядку big-endian, соглашение little-endian поддерживают меньше кросс-платформенных протоколов и форматов данных; существенные исключения: USB, конфигурация PCI, таблица разделов GUID, рекомендации FidoNet.

Переключаемый порядок

Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, ARM, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, PA-RISC и IA-64. Обычно порядок байт выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на материнской плате. В этом случае правильнее говорить о порядке байт операционной системы. Переключаемый порядок байт иногда называют англ. bi-endian.

Смешанный порядок

Смешанный порядок байт (англ. middle-endian) иногда используется при работе с числами, длина которых превышает машинное слово. Число представляется последовательностью машинных слов, которые записываются в формате, естественном для данной архитектуры, но сами слова следуют в обратном порядке.

Классический пример middle-endian — представление -байтных целых чисел на -битных процессорах семейства PDP-11 (известен как PDP-endian). Для представления двухбайтных значений (слов) использовался порядок little-endian, но -хбайтное двойное слово записывалось от старшего слова к младшему.

В процессорах VAX и ARM используется смешанное представление для длинных вещественных чисел.

Различия

Endian.png

Существенным достоинством little-endian по сравнению с big-endian порядком записи считается возможность «неявной типизации» целых чисел при чтении меньшего объёма байт (при условии, что читаемое число помещается в диапазон). Так, если в ячейке памяти содержится число , то прочитав его как int16 (два байта) мы получим число , прочитав один байт — число . Однако, это же может считаться и недостатком, потому что провоцирует ошибки потери данных.

Обратно, считается что у little-endian, по сравнению с big-endian есть «неочевидность» значения байт памяти при отладке (последовательность байт (A1, B2, C3, D4) на самом деле значит , для big-endian эта последовательность (A1, B2, C3, D4) читалась бы «естественным» для арабской записи чисел образом: ). Наименее удобным в работе считается middle-endian формат записи; он сохранился только на старых платформах.

Для записи длинных чисел (чисел, длина которых существенно превышает разрядность машины) обычно предпочтительнее порядок слов в числе little-endian (поскольку арифметические операции над длинными числами производятся от младших разрядов к старшим). Порядок байт в слове — обычный для данной архитектуры.

Маркер последовательности байт

Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байт (англ. byte order mark (BOM)). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует.

Bom.png

Представление BOM в кодировках

Кодирование Представление (Шестнадцатеричное)
UTF-8 EF BB BF
UTF-16 (BE) FE FF
UTF-16 (LE) FF FE
UTF-32 (BE) 00 00 FE FF
UTF-32 (LE) FF FE 00 00

В кодировке UTF-8, наличие BOM не является существенным, поскольку, нет альтернативной последовательности байт. Когда BOM используется на страницах или редакторах для контента закодированного в UTF-8, иногда он может представить пробелы или короткие последовательности символов, имеющие странный вид (такие как ). Именно поэтому, при наличии выбора, для совместимости, как правило, лучше упустить BOM в UTF-8 контенте.Однако BOM могут еще встречаться в тексте закодированном в UTF-8, как побочный продукт перекодирования или потому, что он был добавлен редактором. В этом случае BOM часто называют подписью UTF-8.

Когда символ закодирован в UTF-16, его или байта можно упорядочить двумя разными способами (little-endian или big-endian). Изображение справа показывает это. Byte order mark указывает, какой порядок используется, так что приложения могут немедленно расшифровать контент. UTF-16 контент должен всегда начинатся с BOM.

BOM также используется для текста обозначенного как UTF-32. Аналогично UTF-16 существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE. К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом

Проблемы Юникода

В Юникоде английское «a» и польское «a» — один и тот же символ. Точно так же одним символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.

Примеры

Если записать строку ‘hello мир’ в файл exampleBOM, а затем сделать его hex-дамп, то можно убедиться в том, что разные символы кодируются разным количеством байт. Например, английские буквы,пробел, знаки препинания и пр. кодируются одним байтом, а русские буквы — двумя

Код на python

#!/usr/bin/env python
#coding:utf-8
import codecs
f = open('exampleBOM','w')
b = u'hello мир'
f.write(codecs.BOM_UTF8)
f.write(b.encode('utf-8'))
f.close()

hex-дамп файла exampleBOM

Символ BOM h e l l o Пробел м и р
Код в UNICODE EF BB BF 68 65 6C 6C 6F 20 D0 BC D0 B8 D1 80
Код в UTF-8 11101111 10111011 10111111 01101000 01100101 01101100 01101100 01101111 00100000 11010000 10111100 11010000 10111000 11010001 10000000

См. также

  • Представление целых чисел: прямой код, код со сдвигом, дополнительный код
  • Представление вещественных чисел

Источники информации

  • Wikipedia — таблица ASCII
  • Wikipedia — стандарт UNICODE
  • Wikipedia — Byte order mark
  • Wikipedia — Порядок байтов
  • Wikipedia — Юникод
  • Wikipedia — Windows-1251
  • Wikipedia — UTF-8
  • Wikipedia — UTF-16
  • Wikipedia — UTF-32

  • Как клонировать только windows на ssd
  • Как клонировать систему с hdd на ssd windows 10
  • Как клонировать репозиторий с github на windows
  • Как клонировать windows на ssd acronis
  • Как клонировать разделы жесткого диска с windows на ssd диск