Dlaczego znaki" control " są nielegalne w XML 1.0?

Istnieje wiele znaków, które nie są legalnie kodowane w XML 1.0, np. U+0007 ('bell') i U+001B ('escape'). Większość interesujących z nich to nie-białe znaki "control".

Z (np.) tego pytania i innych wynika, że to XML spec jest problemem -- ale czy ktoś może mi wyjaśnić, dlaczego XML Spec zabrania tych znaków?

Wydaje się, że mogło być wymagane, aby były zakodowane w ucieczki, np. jako  i , ale może jest praktyczny powód, że znaki były zakazane, a nie wymagane do ucieczki?

Odpowiadający zasugerowali, że istnieje pewna motywacja do unikania znaków sterujących transmisją, ale Unicode zawiera wiele innych znaków podobnych do sterowania (rozważ U+200C "zero width non joiner"). Zdaję sobie sprawę, że może nie ma dobrego powodu do tego zachowania, ale nadal chciałbym to zrozumieć lepiej.

Jest to szczególnie frustrujące, ponieważ gdy te wartości znaków pojawiają się w innych kodowaniach formatach danych, kończę na "podwójnych ucieczkach" nowych dokumentach XML, które muszą to zakodować.

Author: Community, 2009-01-01

6 answers

Rozumiem, że zakres ten jest zablokowany ze względu na to, że język znaczników nie powinien mieć żadnej potrzeby obsługi znaków transmisji i sterowania przepływem, a włączenie ich stworzyłoby problem dla wszystkich edytorów i parserów w konwersji binarnej.

Staram się znaleźć coś ex cathedra na ten temat od Tim Bray et al.

Edit: niektóre dyskusja o znakach kontroli i niejasnym przyznaniu, że nie było to dokładnie przesadne:

At 09:27 AM 17/06/00 -0500, Mark Volkmann wrote:

Nigdy nie widziałem dyskusji na temat powodu, dla którego większość kontroli ASCII znaki, takie jak Kanał formularzy, nie są dozwolone w dokumentach XML. Can niech ktoś poda mi powód tej decyzji albo wskaże mi spec. że to wyjaśnia?

Nie jestem pewien, czy zrobilibyśmy to w ten sam sposób, gdybyśmy robili to ponownie. I nie widzę, żeby wyrządzili prawdziwą krzywdę. Oczywiście, jeśli optymalizujesz dla bardzo interoperacyjny content język znaczników (i XML jest) to uzasadnione podejrzenie takich rzeczy jak vertical-tab i backspace i tak dalej... ale jak to może być spójne zostawić w \n I DEL i tak dalej? - Tim

 22
Author: annakata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 18:02:08

To było dawno temu, ale najlepiej pamiętam, że nie mają graficznej reprezentacji, a także nie mają uzgodnionej semantyki. Wybierając parę losowo widzimy U + 0006 "Potwierdź" lub u+0016 "synchroniczny bezczynność"... co to znaczy? Unicode nie mówi. Nawet wtedy, gdy wszyscy twierdzili, że wspierają ASCII, nie było interoperacyjności wokół tych śmieci. XML ma być o interoperacyjności.

Doświadczenie polegało na tym, że ludzie, którzy chcą korzystać z tych rzeczy naprawdę chcą wgrać dane binarne do swoich elementów XML (a następną rzeczą, którą chcą, to włączenie U + 0000 NULL), co było wyraźnym celem XML od dnia 1. Jeśli chcesz reprezentować liczby 0x6 lub 0x16, istnieje wiele dobrych sposobów, aby to zrobić, które nie zamulają pojęcia "znak".

 15
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 16:52:00

Wydaje się, że mogło być wymagane, aby były one kodowane w Escape, np. jako i & #x001B;

Możesz to zrobić dokładnie w XML 1.1, Dla wszystkich oprócz \0.

 14
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 12:16:13

Prawdopodobnie nadszedł czas, aby ponownie podsumować, również z widokiem na XML 1.1.

Jakie punkty kodu znaków sterujących są w Unicode?

  • U+0000 do U+001f, dziedziczone z ASCII.
  • U+007F, dziedziczone z ASCII
  • U+0080 do U+009F, dziedziczone z łaciny-1
  • różne zakresy specjalnego przeznaczenia, ustandaryzowane jawnie dla Unicode i głównie użyteczne zwłaszcza w kontekstach innych niż znaczniki. Są omówione tutaj blok po bloku, w tym powody, dlaczego i jak ich używać lub nie używać w XML i co zrobić, jeśli i tak na nie wpadniesz.

Jak wygląda XML na te znaki sterujące?

To jest inna klasyfikacja.

  • Tab i newline (niezależnie od zależności platformy od tego, co jest nową linią) są dobre. Wszyscy ich używają. Wszyscy wiedzą, co mają oznaczać. Dozwolone w prawie wszystkich znanych formach, często nawet do ładnego drukowania sam znacznik.
  • U+0000 jest złem. Null charakter? String terminator? Szum binarny? Antyteza zarówno do interoperacyjności, jak i znaczników. Zabronione we wszystkich formach.
  • Coś jeszcze? Rzadko używane, problematyczne współdziałanie, ale są sposoby, aby je tolerować, nawet nie wiedząc zbyt wiele o tym, co mają "kontrolować".

Przejdźmy teraz naszą uwagę tylko do tej ostatniej kategorii, kody kontrolne właściwe. Oznacza to, że poniższe podsumowanie nie ma zastosowania do tabulatory i nowe linie: U+0009, U+000a, U+000D, U+0085, U+2028.

XML 1.0 pozwala na wszystkie powyższe zakresy znaków sterujących, z wyjątkiem U+0000 do U+001f, jako tekst (bezpośrednio dołączone znaki) i jako odwołania do znaków numerycznych . Zezwalanie U+007F na U+009Fbyło najwyraźniej przez pominięcie i ta niespójność została poprawiona w XML 1.1, ale odwrotnie. W 2007 roku, w ramach projektu, wprowadzono do użytku nową wersję standardu.]}

[[17]}wreszcie, istnieje spore zapotrzebowanie na definiowanie standardowej reprezentacji dowolnych znaków Unicode w dokumentach XML. Dlatego XML 1.1 pozwala na użycie odniesień znakowych do znaków kontrolnych #x1 do # x1F, z których większość jest zabroniona w XML 1.0. Ze względu na solidność znaki te nadal nie mogą być używane bezpośrednio w dokumentach. W celu poprawy niezawodności wykrywania kodowania znaków, Dodatkowe znaki kontrolne #x7F przez # x9F, które były swobodnie dozwolone w dokumentach XML 1.0, teraz musi również występować tylko jako odniesienia do znaków. (Białe znaki są oczywiście wyłączone.) Niewielkie poświęcenie zgodności wstecznej jest uważane za nieistotne. Ze względu na potencjalne problemy z interfejsami API, #x0 jest nadal zabronione zarówno bezpośrednio, jak i jako odniesienie do znaków.

Dlaczego Unicode i XML pozwalają na swobodne używanie znaków sterujących podobnych do znaczników, poza nielicznymi" odziedziczonymi " zakresami? Ludzie powinni używać do tego znaczników.

Unicode jest również używany w konteksty bez znaczników i jest to wciąż rozwijający się zestaw znaków. Zaimplementowanie zgodnego procesora XML byłoby zbyt trudne, gdyby zestaw znaków niekontrolowanych był ruchomym celem.

Ok, co jest nie tak z odziedziczonymi zakresami, w porównaniu do znaków sterujących specyficznych dla Unicode?

Brak standaryzacji. Konsorcjum Unicode tak naprawdę nie było w stanie wybrać, które liczby są przypisane do tych "znaków" , ani jakie są ich typowe wizualne prezentacja lub znaczenie. Pełna kompatybilność wsteczna z ASCII (na zakodowanym poziomie UTF-8) i z Latin-1 (na poziomie przypisywania punktów kodu) wymusiła surowe włączenie tych punktów kodu niezależnie od różnych specjalistycznych i przeciążonych znaczeń, często dołączanych do nich w różnych kontekstach przetwarzania tekstu.

Czekaj, chcesz powiedzieć, że XML nie ma być w pełni wstecznie kompatybilny z ASCII, w przeciwieństwie do UTF-8?

Tak. Zgadza się. Potrzebujesz elementu dokumentu. Ty nie można nawet włożyć surowego < lub &. Dlaczego więc w ogóle trzeba było wstawiać surowe znaki kontrolne?
 9
Author: Jirka Hanika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 12:15:33

XML został zaprojektowany specjalnie wokół Unicode (w szczególności UTF-8 i UTF-16) i ISO/IEC 10646, z których oba (nie jestem całkiem pozytywnie nastawiony do ISO 10646) zawierają znaki transmisji/kontroli przepływu, które pozostały z ASCII i dni terminali opartych na znakach. Chociaż te znaki nadal mają zastosowania, nie należą do formatu takiego jak XML.

Jeśli chodzi o te nowe kodowania, które używają tych kodów do czegoś innego, cóż, wydaje się, że specyfikacja XML może potrzebować Przystosuj się.

 1
Author: foxxtrot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-31 22:48:40

Dlaczego uciekasz im podwójnie? Wydaje się to dobrym miejscem dla & bell; i & escape;. (Undefined, obsługiwane przez callback z parsera do Twojego kodu)

 1
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-09 14:53:50