2010-09-22 13 views
10

Norma definiujezestawy postaci - nie wiadomo

  • podstawowy charakter źródło Set Zestaw

  • podstawowy charakter wykonawczy i jego szeroki char odpowiednik

definiuje także zestaw „realizacja znaków i jego szeroki odpowiednik w następujący sposób:

$ 2,2/3- "Zestaw znaków wykonawczych i zestaw szerokoekranowych znaków wykonawczych to odpowiednio zestawy podstawowe zestawu wykonawczego i podstawowy zestaw wykonawczy o szerokim spektrum znaków, . Wartości członków zestawów znaków wykonanie są wdrożenie zdefiniowane, a wszelkie dodatkowi członkowie są ustawień narodowych.”

Q1. Nie sądzę, żeby to zrozumieć całkowicie, szczególnie ostatnie stwierdzenie Wszelkie wskazówki na temat tego aspektu

Ponadto

$ 3.9.1 -.? „Obiekty zadeklarowane jako znaków (char) powinny być duże wystarczy przechowywać dowolny element podstawowego zestawu znaków wdrażania za .”

Q2. W 3.9.1 wyrażenie "podstawowy zestaw znaków" oznacza "podstawowy zestaw znaków wykonawczych"?

Odpowiedz

16

Trzeba rozróżniają zestawu znaków źródłowego, zestawu znaków wykonanie, postać wykonania drutu ustawiony i jest to podstawowe wersje:

podstawowego zestawu znaków Źródło:

§2.1. 1: Podstawowy źródłowy zestaw znaków składa się z 96 znaków [...]

Ten zestaw znaków ma dokładnie 96 znaków. Pasują do 7 bitów. Znaki takie jak @ nie są uwzględniane.

Przyjrzyjmy się przykładowym reprezentacjom binarnym dla kilku podstawowych znaków źródłowych. Mogą być całkowicie dowolne i nie ma potrzeby, aby odpowiadały wartościom ASCII.

A -> 0000000 
B -> 0100100 
C -> 0011101 

Podstawowy zestaw znaków wykonanie ...

§2.1.3: zestaw podstawowy charakter wykonanie i podstawowy zestaw wykonanie szerokości znaków każdy powinien zawierać wszystkie elementy podstawowego charakteru źródłowego set, plus znaki kontrolne reprezentujące alert, backspace i powrót karetki oraz znak null (odpowiednio, szeroki znak null), którego reprezentacja ma wszystkie bity zerowe.

Jak stwierdzono podstawowy zestaw znaków wykonywania zawiera wszystkie elementy podstawowego zestawu znaków źródłowych. Wciąż nie zawiera żadnej innej postaci, takiej jak @. Podstawowy zestaw znaków wykonania może mieć inną reprezentację binarną.

Jak stwierdzono, podstawowy zestaw znaków wykonywania zawiera reprezentacje powrotu karetki, znak null i inne znaki.

A   -> 10110101010 
B   -> 00001000101 <- basic source character set 
C   -> 10101011111 
---------------------------------------------------------- 
null  -> 00000000000 
Backspace -> 11111100011 

Jeśli podstawowy zestaw znaków wykonanie jest długa 11 bitów (tak jak w tym przykładzie) typ danych char powinien być na tyle duży, aby przechowywać 11 bitów, ale może być dłuższy.

... a Podstawowym wykonanie szeroki zestaw znaków:

Podstawowym wykonanie szeroki znak jest używany do szerokich znaków (wchar_t). Zasadniczo to samo, co podstawowy zestaw znaków wykonawczych, ale może również mieć różne reprezentacje binarne.

A   -> 1011010101010110101010 
B   -> 0000100010110101011111 <- basic source character set 
C   -> 1010100101101000011011 
--------------------------------------------------------------------- 
null  -> 0000000000000000000000 
Backspace -> 1111110001100000000001 

Jedynym członkiem stałej zerowa jest postać, która musi być sekwencją 0 bitów.

Konwersja między zasadowy charakter określa:

§2.1.1.5: Każdy członek charakter źródło zestaw, ucieczka sekwencję lub uniwersalny charakter-name w literałów znakowych i napisowych jest konwertowany do członka zestaw znaków wykonawczych (2.13.2, 2.13.4).

Następnie kompilowany jest plik źródłowy C++, każdy znak źródłowego zestawu znaków jest konwertowany na podstawowy zestaw znaków (szeroki).

przykład:

const char* string0 = "BA\bC"; 
const wchar_t string1 = L"BA\bC"; 

Ponieważ string0 jest normalnie postać może być przekształcany do podstawowego zestawu znaków wykonanie i string1 zostanie przekształcony w wykonaniu podstawowym szerokiego zestawu znaków.

string0 -> 00001000101 10110101010 11111100011 10101011111 
string1 -> 0000100010110101011111 1011010101010110101010 // continued 
      1111110001100000000001 1010100101101000011011 

Coś o kodowaniu plików:

Istnieje kilka rodzaj kodowania plików. Na przykład: ASCII o długości 7 bitów. Windows-1252 o długości 8 bitów (znany jako ANSI). ASCII nie zawiera znaków innych niż angielskie. ANSI zawiera niektóre znaki europejskie, takie jak ä Ö ä Õ ø.

Nowsze kodowania plików, takie jak UTF-8 lub UTF-32, mogą zawierać znaki dowolnego języka. UTF-8 to znaki o zmiennej długości. UTF-32 mają długość 32 bitów.

pliku enconding wymagania:

Większość kompilatory oferują przełącznika wiersza polecenia, aby określić kodowanie pliku źródłowego pliku.

Plik źródłowy C++ musi być zakodowany w kodowaniu pliku, który ma reprezentację podstawowego zestawu znaków źródłowych. Na przykład: Kodowanie pliku źródłowego musi mieć reprezentację znaku ;.

Jeśli możesz wpisać znak ; w kodowaniu wybranym jako kodowanie pliku źródłowego, kodowanie nie jest odpowiednie jako kodowanie źródłowego pliku C++.

dla podstawowych zestawów znaków:

Postacie nie wchodzące w skład zestawu znaków źródło podstawowych należą do zestawu znaków źródła. Zestaw znaków źródłowych jest równoważny kodowaniu plików.

Na przykład: znak @ nie jest zawarty w podstawowym źródłowym znaku, ale może być zawarty w źródłowym zestawie znaków. Wybrane kodowanie pliku źródłowego może zawierać reprezentację @. Jeśli nie zawiera reprezentacji dla @, nie można używać znaku @ w ciągu znaków.

Znaki nie zawarte w podstawowym (szerokim) zestawie znaków należą do zestawu znaków wykonawczych (szerokiego).

Należy pamiętać, że kompilator konwertuje znak z zestawu znaków źródłowych na zestaw znaków wykonawczych i szeroki zestaw znaków wykonawczych. Dlatego musi istnieć sposób, w jaki można konwertować te znaki.

Na przykład: Jeśli podasz Windows-1252 jako kodowanie zestawu znaków źródło i określić ASCII jako znak szeroki wykonania ustaw nie ma sposobu, aby przekształcić ten ciąg:

const char* string0 = "string with European characters ö, Ä, ô, Ð."; 

Znaki te nie mogą być reprezentowane w ASCII.

Określanie zestawów znaków:

Oto kilka przykładów, jak określić zestawy znaków za pomocą gcc. Wartości domyślne są uwzględniane.

-finput-charset=UTF-8   <- source character set 
-fexec-charset=UTF-8   <- execution character set 
-fwide-exec-charset=UTF-32 <- execution wide character set 

Z UTF-8 i UTF-32 jako domyślnego kodowania plików źródłowych C++ może zawierać ciągi z charakterem dowolnym języku. Znaki UTF-8 można konwertować w obie strony bez problemów.

rozszerzonego zestawu znaków:

§1.1.3: znak wielobajtowego, sekwencja jednego lub więcej bajtów reprezentujących członek rozszerzonego zestawu znaków albo źródła lub środowiska wykonawczego. Rozszerzony zestaw znaków jest nadzbiorem podstawowego zestawu znaków (2.2).

Znaki wielobajtowe są dłuższe niż zwykłe znaki. Zawierają sekwencję specjalną, oznaczającą je jako znak wielobajtowy.

Znaki wielobajtowe są przetwarzane zgodnie z zestawem ustawień regionalnych w środowisku wykonawczym użytkownika. Te wielobajtowe znaki są konwertowane w środowisku wykonawczym na zestaw kodowania w środowisku użytkownika.

+1

To zdanie jest nieco trudne do naśladowania: "Jeśli możesz wpisać znak, w kodowaniu wybranym jako kodowanie pliku źródłowego kodowanie nie jest odpowiednie jako kodowanie pliku źródłowego C++." Co to znaczy? – JCx

+0

Myślę, że '-fexec-charset = UTF-8' jest złym przykładem, ponieważ nie jest zgodny. Idea jest jasna: podstawowym zestawem znaków exec_ powinien być Unicode, ale wtedy (jak sam podkreśliłeś) 'char' powinien mieć szerokość 20 bitów, aby pomieścić wszystkie wartości Unicode. Jednak 'UTF-8' jest kodowaniem o zmiennej długości, co oznacza, że ​​nadaje się tylko jako _rozszerzony zbiór znaków_. – MSalters