Programowanie w systemie UNIX/Kodowanie

 "Kompletne dzieła Szekspira, nieskompresowane, zajmują mniej więcej tyle samo miejsca, co 2 typowe zdjęcia zrobione nowoczesnym smartfonem (~5 megabajtów)."[1]


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

TypyEdytuj

Podział klasyczny

  • prosty tekst (ang. plain text) - niesformatowany
  • bogaty tekst ( ang. rich text) - sformatowany


Podział plików tekstowych wg MIME

  • text/1d-interleaved-parityfec
  • text/cache-manifest appcache manifest
  • text/calendar ics ifb
  • text/cql CQL
  • text/cql-extension
  • text/cql-identifier
  • text/css css
  • text/csv csv
  • text/csv-schema csvs
  • text/dns soa zone
  • text/encaprtp
  • text/enriched
  • text/example
  • text/fhirpath
  • text/flexfec
  • text/fwdred
  • text/gff3 gff3
  • text/grammar-ref-list
  • text/html html htm shtml
  • text/javascript es js mjs
  • text/jcr-cnd cnd
  • text/markdown md markdown
  • text/mizar miz
  • text/n3 n3
  • text/parameters
  • text/parityfec
  • text/plain[2] txt text pot brf srt
  • text/provenance-notation provn
  • text/prs.fallenstein.rst rst
  • text/prs.lines.tag tag dsc
  • text/prs.prop.logic
  • text/raptorfec
  • text/RED
  • text/rfc822-headers
  • text/rtf
  • text/rtp-enc-aescm128
  • text/rtploopback
  • text/rtx
  • text/SGML sgml sgm
  • text/shaclc shaclc shc
  • text/shex shex
  • text/spdx spdx
  • text/strings
  • text/t140
  • text/tab-separated-values tsv
  • text/texmacs tm
  • text/troff t tr roff
  • text/turtle ttl
  • text/ulpfec
  • text/uri-list uris uri
  • text/vcard vcf vcard
  • text/vnd.a a
  • text/vnd.abc abc
  • text/vnd.ascii-art ascii
  • text/vnd.curl curl
  • text/vnd.debian.copyright copyright
  • text/vnd.DMClientScript dms
  • text/vnd.dvb.subtitle
  • text/vnd.esmertec.theme-descriptor jtd
  • text/vnd.familysearch.gedcom ged
  • text/vnd.ficlab.flt flt
  • text/vnd.fly fly
  • text/vnd.fmi.flexstor flx
  • text/vnd.gml
  • text/vnd.graphviz gv dot
  • text/vnd.hans hans
  • text/vnd.hgl hgl
  • text/vnd.in3d.3dml 3dml 3dm
  • text/vnd.in3d.spot spot spo
  • text/vnd.IPTC.NewsML
  • text/vnd.IPTC.NITF
  • text/vnd.latex-z
  • text/vnd.motorola.reflex
  • text/vnd.ms-mediapackage mpf
  • text/vnd.net2phone.commcenter.command ccc
  • text/vnd.radisys.msml-basic-layout
  • text/vnd.senx.warpscript mc2
  • text/vnd.sosi sos
  • text/vnd.sun.j2me.app-descriptor jad
  • text/vnd.trolltech.linguist ts
  • text/vnd.wap.si si
  • text/vnd.wap.sl sl
  • text/vnd.wap.wml wml
  • text/vnd.wap.wmlscript wmls
  • text/vtt vtt
  • text/x-bibtex bib
  • text/x-boo boo
  • text/x-c++hdr h++ hpp hxx hh
  • text/x-c++src c++ cpp cxx cc
  • text/x-chdr h
  • text/x-component htc
  • text/x-csh csh
  • text/x-csrc c
  • text/x-diff diff patch
  • text/x-dsrc d
  • text/x-haskell hs
  • text/x-java java
  • text/x-lilypond ly
  • text/x-literate-haskell lhs
  • text/x-moc moc
  • text/x-pascal p pas
  • text/x-pcs-gcd gcd
  • text/x-perl pl pm
  • text/x-python py
  • text/x-scala scala
  • text/x-setext etx
  • text/x-sfv sfv
  • text/x-sh sh
  • text/x-tcl tcl tk
  • text/x-tex tex ltx sty cls
  • text/x-vcalendar vcs
  • text/xml
  • text/xml-dtd
  • text/xml-external-parsed-entity



Przykłady prostych plików tekstowych:


csvEdytuj

Przykładowy csv[3], 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

pliki konfiguracyjneEdytuj

Biblioteka

  • TOML ( Tom's Obvious Minimal Language) -A config file format for humans[4]

Grafika ASCIEdytuj

Grafika ASCI ( ASCI-Art)


Directory content

docs/
├── img/            # Image dir
├── include/        # TeX and HTML options
├── parts/          # Markdown content
├── _bookdown.yml   # bookdown options
├── _output.yml     # rmd output options
├── book.pdf        # PDF output
├── index.html      # HTML output
├── main.rmd        # main MD file
├── Makefile
└── README.md

Grafika UnicodeEdytuj

Grafika Unicode [5]


  ┌─head─┐     ┌──value──┐       ┌──value──┐
  │   ├───────►│    4    │       │    0    │
  └──────┘     ├───next──┤       ├───next──┤
               │    ├───────────►│   NULL  │
               └─────────┘       └─────────┘

icalEdytuj

Plik iCalendar[6][7] służy do zapisu danych kalendarzy. [8]

  • 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:

BudowaEdytuj

Prosty plik tekstowy:[11]

  • składa się ze znaków
  • znaki mogą być pogrupowanych w wyrazy i linie.[12] Wtedy plik może zawierać znaki końca linii (EOL)
  • plik może się rozpoczynać znakiem kolejności bajtów (BOM)
  • plik jest zakończony znakiem końca pliku (EOF)[13].


Linia jest to ciąg znaków[14] (drukowalnych[15] i niedukowalnych[16]) zakończony znakiem końca linii[17]

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

Sygnatura plikuEdytuj

KodowanieEdytuj

Co każdy programista powinien wiedzieć o

  • kodowaniu wg Davida C. Zentgrafa [21]
  • zestawach znaków wg Joel Spolsky[22]

Kod alfanumerycznyEdytuj

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

Standardy kodowaniaEdytuj

Standardy:

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

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

Pojęcia

  • standard kodowania: komputerowy standard kodowania zestawu znaków
  • strona kodowa ( ang. "code page")- tabela zawierająca znaki i odpowiadające im kody
  • Zestaw znaków ( charset)
  • progam kodujący (ang. Character Map ) - graficzny program pokazujący znak dla odpowiedniego kodu i odwroitnie w różnych standardach kodowania

DekoderyEdytuj

Dekoder znaków (ang. char) czyli jak sprawdzić znak?


Dekoder plików / tekstu

TestyEdytuj

Jak sprawdzić kodowanie pliku w konsoli ?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 :[33]

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[34] lub Okteta.[35]

Typowe problemyEdytuj

ZnakiEdytuj

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

Znaki z punktu widzenia programisty dzielimy na:

  • drukowalne
  • niedrukowalne

Podział wg znaczenia : [37]

  • 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%)


Klasy znaków ( character classes) wyrażeń regularnych Bash ( Bash Regular Expressions = BRE)[38]

  • [[:alpha:]] - matches any alphabetic character written in upper or lower case.
  • [[:alnum:]]- matches any alphanumeric character - namely, the characters in the range 0-9, A-Z, a-z.
  • [[:blank:]] - matches a space and a tab character.
  • [[:digit:]]- any numeric character from 0to 9.
  • [[:upper:]]- uppercase alphabetic characters - A-Z.
  • [[:lower:]]- alphabetic characters in lower case - a-z.
  • [[:print:]] - matches any printable character.
  • [[:punct:]] - matches punctuation marks.
  • [[:space:]]- whitespace, in particular - a space, a tab character, characters NL, FF, VT, CR.



Podział wg strony kodowej [39]

  • ascii
  • unicode
    • UTF-8




Znaki drukowalneEdytuj

Program[40] 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 znakiEdytuj

  • 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 )[41]
    • 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;


DywizEdytuj

Standard ASCII przewidywał wspólny znak dla:

  • łącznika
  • minusa
  • myślnika

Wspólny znak kreski poziomej w zestawie znaków ASCII znajduje się na pozycji 45 i określany jest jako łącznik-minus (ang. hyphen-minus). Z punktu widzenia typografii jest to rozwiązanie daleko niewystarczające, ale podyktowane było względami technicznymi ówczesnego poziomu rozwoju technik informacyjnych. Kolejne wprowadzane w komputerach osobistych zestawy znaków były zgodne ze standardem ASCII, jednak zwiększały liczbę dostępnych znaków. Stosowany w polskiej wersji systemu Windows zestaw Windows-1250 zawiera obok znaku łącznika-minusa (Alt+045) również znaki półpauzy (Alt+0150) i pauzy (Alt+0151). Wprowadzony później standard Unikod (ang. Unicode) obejmujący wszystkie możliwe znaki wszystkich znanych języków, również zgodny ze standardem ASCII, zawiera znaki łącznika-minusa (U+002D), półpauzy (U+2013) i pauzy (U+2014), ale obok nich również znaki łącznika (U+2010) i minusa (U+2212). Typograficznie właściwym dla dywizu jest w Unikodzie znak (U+2010)[uwaga 1]

Nazwa Znak Unicode Kod HTML Nazwa unikodowa
Dywiz (łącznik) &#x2010; lub &#8208; HYPHEN
Łącznik-minus &#x2D; lub &#45; HYPHEN-MINUS
Minus &minus; lub &#x2212; lub &#8722; MINUS SIGN
Półpauza (myślnik) &ndash; lub &#x2013; lub &#8211; EN DASH
Pauza (myślnik) &mdash; lub &#x2014; lub &#8212; EM DASH
Kreska liczbowa &#x2012; lub &#8210; FIGURE DASH

Poziome zestawienie powyższych znaków w tej samej kolejności:

-

Podobnie jak większość zaawansowanych edytorów tekstów, standard Unicode przewiduje specjalne znaki dla specyficznych sytuacji, związanych z automatyzacją przetwarzania tekstu:

  • miękki (opcjonalny) łącznik (U+00AD), który pozostaje ukryty, gdy znajduje się w środku wiersza, jest natomiast widoczny, gdy przypada na koniec wiersza;
  • łącznik, po którym wyraz nie może być dzielony (U+2011), którego należy użyć na przykład w słowie K‑219.

Dywiz charakterystyczny m.in. dla polskiej ortografii, tj. łącznik stawiany na końcu wiersza i powtarzany na początku następnego, jak w poniższym przykładzie:

Akademia Górniczo-
-Hutnicza

można uzyskać przez kombinację miękkiego łącznika i łącznika niełamiącego.

Znaki niedrukowalneEdytuj

  • znaki specjalne [42]


Przykłady:

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


Wyświetlanie znaków niedrukowalnychEdytuj

(nazwa pliku przykładowa):


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

 sed -n 'l' myfile.txt


lub vim


 vi -b myfile.txt

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

catEdytuj
   cat -t -e p.txt


Formatowanie pliku makefile sprawdzimy za pomocą: [49]

  cat -e -t -v makefile

W wyniku:

  • tabulatory jako ^I
  • końcówki linii jako $

BOMEdytuj

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


Znajdowanie plików z BOM :[51]

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


W c: [53]


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

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

Dodać:

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

EOLEdytuj

Koniec linii (ang. End Of Line, EOL) – znak lub sekwencja znaków oznaczająca zakończenie linii tekstu.


Współczesne edytory tekstu zwykle obsługują wszystkie sposoby oznaczania końca linii. Wiele innych programów również przetwarza tekst niezależnie od tego, jaki rodzaj zakończenia linii w nim występuje, jednak nie można zakładać, że automatyczne rozpoznawanie formatu zawsze zadziała poprawnie.

Błędna identyfikacja oznaczenia końca linii może doprowadzić do traktowania plików binarnych jako tekstowych i na odwrót, co może powodować błędną interpretację zawartości przy odczycie lub uszkodzenie danych przy zapisie. W związku z tym istnieje możliwość wymuszenia otwarcia lub przesłania pliku w trybie tekstowym albo binarnym. W trybie tekstowym znaki końca linii mogą być automatycznie zamieniane na znaki stosowane natywnie w systemie docelowym, natomiast w trybie binarnym wszystkie znaki pozostają nienaruszone.


W różnych systemach operacyjnych stosuje się określone znaki końca linii:


EOFEdytuj

znakiem końca pliku (EOF)[55].

info o plikuEdytuj


String czyli łańcuchy znakówEdytuj


Dzielenie łańcuchów na słowaEdytuj

Wczytywanie danych z pliku - parserEdytuj


Zobacz równieżEdytuj


Przypisy

  1. quora: What-s-something-a-computer-programmer-knows-that-would-amaze-people-who-use-computers
  2. Plain Text - Dylan Beattie - NDC Copenhagen 2022
  3. CSV to iCal Calendar Convertor by Manas Tungare
  4. https://toml.io/en/
  5. stackoverflow question: i-dont-understand-how-this-code-replaces-the-head-of-a-linked-list-or-how-to ?
  6. Internet Calendaring and Scheduling Core Object Specification (iCalendar)
  7. iCalendar Specification Excerpts
  8. Pliki w formacie iCalendar
  9. libical library
  10. gcalcli library
  11. Plik tekstowy
  12. linia w ang. wikipedii
  13. EOF w wikipedii
  14. znakowy typ danych w wikipedii
  15. znaki drukowalne w wikipedii
  16. znaki niedrukowalne w wikipedii
  17. Koniec linii w wikipedii
  18. spacja
  19. sygnsatura poliku w ang. wikipedii
  20. How to Determine Text File Encoding Submitted by Ben Bryant
  21. What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text by David C. Zentgraf
  22. the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses by Joel Spolsky
  23. unicode - strona domowa
  24. Character Encoder / Decoder
  25. Online Character Map
  26. wikipedia kod znaku
  27. Mausr - Marek's Unicode Symbols Recognizer
  28. iconv − character set conversion
  29. iconv − character set conversion
  30. Browser Test Page for Unicode Character
  31. jak korzystać w c z utf-8
  32. C i unicode
  33. od - The Geek stuff
  34. Jeex
  35. Okteta - edytor plików binarnych
  36. stackoverflow question representing-eof-in-c-code
  37. znaki unicode
  38. bash-scripts-regular-expressions by Mikhail Raevskiy Sep 20, 2020
  39. What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text by David C. Zentgraf
  40. cppreference : ascii
  41. UTF-8 General Punctuation. Range: Decimal 8192-8303. Hex 2000-206F.
  42. Handling special characters in C (UTF-8 encoding)- stackoverflow
  43. Newline in wikipedia
  44. soscisurvey : view-chars
  45. bash function to highlight non-printing characters: tab, newline, BOM, nbsp
  46. datacadamia : bash whitespace
  47. alvin alexander : display-nonprintable-characters-in-text-file
  48. https://www.obliczeniowo.com.pl/794
  49. stackoverflow question: makefile4-missing-separator-stop
  50. BOM w wikipedii
  51. Elegant way to search for UTF-8 files with BOM?
  52. dos2unix converters
  53. Unicode encodings
  54. A Shell Script to Find and Remove the BOM Marker by Enrico M. Crisostomo
  55. EOF w wikipedii


Błąd rozszerzenia cite: Istnieje znacznik <ref> dla grupy o nazwie „uwaga”, ale nie odnaleziono odpowiedniego znacznika <references group="uwaga"/>