Programowanie w systemie UNIX/Kodowanie

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

Plik tekstowy (ang. text file) –

  • zawartość : tekst: dane w postaci alfanumerycznej. Uwaga są plik zawierające tekst w formie binarnej ( pdf, doc)
  • format pliku:
    • ciąg linii tekstu elektronicznego
    • nie jest plikiem binarnym
    • pozwala na otwarcie w edytorze tekstu

przykłady[edytuj]

  • prosty tekst
  • skrypty
  • kody źródłowe programów


Budowa[edytuj]

Plik tekstowy:

  • składa się ze znaków (kod znaku),
    • może się rozpoczynać znakiem kolejności bajtów (BOM)
    • może zawierać znaki końca linii (EOL)
    • jest zakończony znakiem końca pliku (EOF)

Kodowanie[edytuj]

Co każdy programista powinien wiedzieć o

  • kodowaniu wg Davida C. Zentgrafa [1]
  • zestawach znaków wg Joel Spolsky[2]

Kod alfanumeryczny[edytuj]

Kod alfanumeryczny (ang. alphanumeric code) – kod, w którym do zapisu tekstów i liczb, przedstawianych jako ciągi cyfr, używa się określonych w danym kodzie znaków Przykładami kodów alfanumerycznych są kody:

  • ASCII
  • UTF-8
  • ISO 8859
  • Unicode ISO 10646
  • EBCDIC
  • Windows-1250.

Niektóre z kodów dopuszczają także kody sterujące, znaki diakrytyczne i znaki specjalne np. Unicode.

Dekodery[edytuj]

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 : [11]

  • 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 [12]

  • ascii
  • unicode
    • UTF-8

Znaki drukowalne[edytuj]

Program[13] drukuje znaki drukowalne ASCII:

// https://en.cppreference.com/w/c/language/ascii
// printtable ASCII
#include <stdio.h>
 
int main(void)
{
    puts("Printable ASCII:");
    for (int i = 32; i < 127; ++i) {
        putchar(i);
        putchar(i % 16 == 15 ? '\n' : ' ');
    }
}


Wynik:

Printable ASCII:
  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~


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 )[14]
    • 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 &minus; &#x2212; &#8722;
Hyphen-minus - U+002D &#45; %2D
Full-width Hyphen-minus U+FF0D %EF%BC%8D &#xff0d; &#65293;

Znaki niedrukowalne[edytuj]

  • znaki specjalne [15]


Przykłady:

  • newline character (LF = Line Feed \n, \x0a)[16]


Wyświetlanie znaków niedrukowalnych[edytuj]

  • online[17]
  • w konsoli[18] (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 = Octal Dump:

od -c p.txt # c same as -t c, select printable characters or backslash escapes
 od -tx1  file # output as a hexadecimal 1-byte units 

lub hexdump:

 hexdump -C file  # tell you byte-for-byte what the file actually contains


lub z użyciem sed[19]

 sed -n 'l' myfile.txt

lub vim


 vi -b myfile.txt

lub otworzyć w LibreOffice Writer i zaznaczyć opcję pokaż Menu/Widok/Znaczniki formatowania[20]

BOM[edytuj]

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


Znajdowanie plików z BOM :[22]

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[23]


W c: [24]


// 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ą:[25]

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[26] składa się z linii[27] i kończy się znakiem końca pliku ( EOF )[28].

Linia jest to ciąg znaków[29] (drukowalnych[30] i niedukowalnych[31]) zakończony znakiem końca linii[32]

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


typy plików tekstowych[edytuj]


csv[edytuj]

Przykładowy csv[34], 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[35][36] służy do zapisu danych kalendarzy. [37]

  • 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[40]
  • BOM [41]

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 :[44]

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[45] lub Okteta.[46]

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