Programowanie w systemie UNIX/Kodowanie

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Wstęp[edytuj]

  • Co każdy programista powinien wiedzieć o kodowaniu wg Davida C. Zentgrafa [1]

Kodowanie[edytuj]

Dekodery[edytuj]

  • znaków (ang. char)
    • Character Encoder / Decoder [2]
    • Online Character Map [3]
    • wikipedia kod znaku[4]
    • Mausr - Marek's Unicode Symbols Recognizer[5]
  • plików


Testy[edytuj]

Typowe problemy[edytuj]

Znaki[edytuj]

Najczęściej używane standardy kodowanie występujące w sieci

Znaki z punktu widzenia programisty dzielimy na:

  • drukowalne
  • niedrukowalne

Podział wg znaczenia : [10]

  • litery (ang. letter) (91.8%), podkategorie: duże (uppercase = Lu) , małe (ang. lowercase = Ll), tytułowe (titlecase = Lt), zmodyfikowane ( modifier = Lm)
  • symbole (ang. symbol) : (5.0%), podkategoria: matematyczne (Symbol, math = Sm), zmodyfikowane (modifier = Sk), walutowe (currency = Sc)
  • znaki (Mark) : (1.4%)
  • cyfry (Number): 1,100 (1.0%)
  • Punctuation: 598 (0.5%)
  • inne (Other): 205 (0.2%)
  • Separator: 20 (0.0%)


Podział wg strony kodowej [11]

  • ascii
  • unicode
    • UTF-8

Znaki drukowalne[edytuj]

Podobne znaki[edytuj]

  • ascii '-' ( Hyphen, dash, minus )
  • UTF-8 characters:
    • kod = U+2212 ( MINUS SIGN )
    • kod = U+002D ( HYPHEN-MINUS )
    • kod = U+005F ( LOW LINE )
    • kod = U+00AF ( MACRON )
    • kod = U+2010 ( HYPHEN )
    • kod = u+2011 ( NON-BREAKING HYPHEN )[12]
    • kod = U+2012 ( FIGURE DASH )
    • kod = U+2013 ( EN DASH )
    • kod = U+2014 ( EM DASH )
    • kod = U+268A ( MONOGRAM FOR YANG )


Read Character Unicode ASCII in URL HTML notations
Minus U+2212 %E2%88%92 − − −
Hyphen-minus - U+002D - %2D
Full-width Hyphen-minus U+FF0D %EF%BC%8D - -

Znaki niedrukowalne[edytuj]

  • znaki specjalne [13]


Wyświetlanie znaków niedrukowalnych[14] (nazwa pliku przykładowa):


cat -t -e p.txt

lub :

hl-nonprinting () { local C=$(printf '\033[0;36m') B=$(printf '\033[0;46m') R=$(printf '\033[0m') np=$(env printf "\u00A0\uFEFF"); sed -e "s/\t/${C}▹&$R/g" -e "s/$/${C}⁋$R/" -e "s/[$np]/${B}& $R/g";}

lub

od -c p.txt

BOM[edytuj]

Unicode Byte-Order-Marker (BOM)[15]


Znajdowanie plików z BOM :[16]

grep -rl $'\xEF\xBB\xBF'

lub :

file * | grep UTF

albo znaleźć i usunąć BOM:

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

lub dos2unix[17]


W c: [18]


// http://unicodebook.readthedocs.org/en/latest/guess_encoding.html
#include <string.h>   /* memcmp() */

const char *UTF_16_BE_BOM = "\xFE\xFF";
const char *UTF_16_LE_BOM = "\xFF\xFE";
const char *UTF_8_BOM = "\xEF\xBB\xBF";
const char *UTF_32_BE_BOM = "\x00\x00\xFE\xFF";
const char *UTF_32_LE_BOM = "\xFF\xFE\x00\x00";

char* check_bom(const char *data, size_t size)
{
    if (size >= 3) {
        if (memcmp(data, UTF_8_BOM, 3) == 0)
            return "UTF-8";
    }
    if (size >= 4) {
        if (memcmp(data, UTF_32_LE_BOM, 4) == 0)
            return "UTF-32-LE";
        if (memcmp(data, UTF_32_BE_BOM, 4) == 0)
            return "UTF-32-BE";
    }
    if (size >= 2) {
        if (memcmp(data, UTF_16_LE_BOM, 2) == 0)
            return "UTF-16-LE";
        if (memcmp(data, UTF_16_BE_BOM, 2) == 0)
            return "UTF-16-BE";
    }
    return NULL;
}


Kodowanie Reprezentacja (hexadecimal) Reprezentacja (decimal) Bajty jako znaki CP1252
UTF-8 EF BB BF 239 187 191 
UTF-16 (BE) FE FF 254 255 þÿ
UTF-16 (LE) FF FE 255 254 ÿþ
UTF-32 (BE) 00 00 FE FF 0 0 254 255 ␀␀þÿ (␀ refers to the ASCII null character)
UTF-32 (LE) FF FE 00 00 255 254 0 0 ÿþ␀␀ (␀ refers to the ASCII null character)
UTF-7 2B 2F 76 38
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F

2B 2F 76 38 2D
43 47 118 56
43 47 118 57
43 47 118 43
43 47 118 47
43 47 118 56 45
+/v8
+/v9
+/v+
+/v/
+/v8-
UTF-1 F7 64 4C 247 100 76 ÷dL
UTF-EBCDIC DD 73 66 73 221 115 102 115 Ýsfs
SCSU 0E FE FF 14 254 255 ␎þÿ (␎ represents the ASCII "shift out" character)
BOCU-1 FB EE 28 251 238 40 ûî(
GB-18030 84 31 95 33 132 49 149 51 „1•3



Można go usunąć za pomocą:[19]

sed '1 s/\xEF\xBB\xBF//' < input > output

Dodać:

printf("\xef\xbb\xbf");

String czyli łańcuchy znaków[edytuj]

Plik tekstowy[edytuj]

Plik tekstowy[20] składa się z linii[21] i kończy się znakiem końca pliku ( EOF )[22].

Linia jest to ciąg znaków[23] (drukowalnych[24] i niedukowalnych[25]) zakończony znakiem końca linii[26]

Linię możemy podzielić na wyrazy rozdzielone spacjami[27]


typy plików tekstowych[edytuj]


csv[edytuj]

Przykładowy csv[28], który może być zaimportowany do kalendarza:

Subject,Start Date,Start Time,End Date,End Time,All Day,Description
My important event,04/19/2012,6:00pm,04/19/2012,9:00pm,false,Longer Description
An all-day event,04/19/2012,,04/19/2012,,true,Missing times are OK
A multi-day event,04/19/2012,6:00pm,04/20/2012,6:00pm,false,Start date and end date are different

ical[edytuj]

Plik iCalendar[29][30] służy do zapisu danych kalendarzy. [31]

  • Pierwszy wiersz w pliku iCalendar zawiera nagłówek = BEGIN: VCALENDAR
  • ostatni wiersz pliku ( stopka) = END:VCALENDAR.
  • Pomiędzy powyższymi wierszami wprowadzane są wydarzenia.
    • wydarzenie musi być ujęte w wiersze BEGIN:VEVENT i END:VEVENT.


BEGIN: VCALENDAR 
BEGIN:VEVENT 
(szczegóły pojedynczego wydarzenia) 
END:VEVENT 
BEGIN:VEVENT 
(szczegóły pojedynczego wydarzenia) 
END:VEVENT 
END:VCALENDAR

biblioteki:

Sygnatura pliku[edytuj]

  • sygnatura pliku w wikipedii[34]
  • BOM [35]

Wczytywanie danych z pliku - parser[edytuj]

Kodowanie pliku[edytuj]

Sprawdzanie za pomocą komendy file ( nazwa pliku i wynik przykładowe) :

file a.txt
a.txt: UTF-8 Unicode (with BOM) text, with very long lines

UTF-8


Za pomocą komendy od :[38]

od -c babymonsterBUM.txt

przykładowy wynik :

0000000 357 273 277   s   i   z   e       2   0   0   0       1   0   0
0000020   0  \n   v   i   e   w       1   5   4       0   .   4   0   2
0000040   6   2   2   3   2   4   2   1   4   1   8   5   2   1   4   8
0000060   0   3   7   8   2   4   7   2   4   5   8   4   0   2   5   8
0000100   3   5   7   5   5   1   3   5   0   1   1   3   4   2   8   8
0000120   1   0   2   7   0   4   2   5   2   5   6   2   7   0   3   9
0000140   5   6   9   5   0   2   8   8   1   6   7   0   9   4   6   7
0000160   4   5   5   5   7   4   1   2   9   3   0   3   2   7   1   1
0000200   5   3   9   3   2   5   8   7   9   4   9   1   3   5   4   8
...
0010260   r   a   t   e   -   m   y   -   f   r   a   c   t   a   l   )
0010300   /   b   a   b   y   -   m   o   n   s   t   e   r   /  \n
0010317

Lub za pomocą edytora binarnego , np. beav, Jeex[39] lub Okteta.[40]

info o pliku[edytuj]

Więcej[edytuj]

Źródła[edytuj]

  1. What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text by David C. Zentgraf
  2. Character Encoder / Decoder
  3. Online Character Map
  4. wikipedia kod znaku
  5. Mausr - Marek's Unicode Symbols Recognizer
  6. iconv − character set conversion
  7. iconv − character set conversion
  8. Browser Test Page for Unicode Character
  9. stackoverflow question representing-eof-in-c-code
  10. znaki unicode
  11. What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text by David C. Zentgraf
  12. UTF-8 General Punctuation. Range: Decimal 8192-8303. Hex 2000-206F.
  13. Handling special characters in C (UTF-8 encoding)- stackoverflow
  14. bash function to highlight non-printing characters: tab, newline, BOM, nbsp
  15. BOM w wikipedii
  16. Elegant way to search for UTF-8 files with BOM?
  17. dos2unix converters
  18. Unicode encodings
  19. A Shell Script to Find and Remove the BOM Marker by Enrico M. Crisostomo
  20. Plik tekstowy
  21. linia w ang. wikipedii
  22. EOF w wikipedii
  23. znakowy typ danych w wikipedii
  24. znaki drukowalne w wikipedii
  25. znaki niedrukowalne w wikipedii
  26. Koniec linii w wikipedii
  27. spacja
  28. CSV to iCal Calendar Convertor by Manas Tungare
  29. Internet Calendaring and Scheduling Core Object Specification (iCalendar)
  30. iCalendar Specification Excerpts
  31. Pliki w formacie iCalendar
  32. libical library
  33. gcalcli library
  34. sygnsatura poliku w ang. wikipedii
  35. How to Determine Text File Encoding Submitted by Ben Bryant
  36. jak korzystać w c z utf-8
  37. C i unicode
  38. od - The Geek stuff
  39. Jeex
  40. Okteta - edytor plików binarnych