2012-12-30 10 views
5

Aktualnie buduję łańcuch znaków skrótu (zwinięty z mapy), w którym wartości są rozdzielane przez specjalny separator jednostki ASCII 31 (1F).Używanie ograniczników ASCII (29-31) w nowoczesnym programowaniu

To ładnie rozwiązuje problem starając się odgadnąć, co znaki ASCII nie zostaną wykorzystane w wartościach łańcuchowych i nie muszę się martwić o ucieczce lub cytowanie wartości itp

Jednak czytając o historii to wydaje się być reliktem z lat 60. i nie widziałem wielu przykładów, w których łańcuchy są budowane i wykorzystywane przy użyciu tej specjalnej postaci, więc wszystko wydaje się zbyt łatwe.

Czy są jakieś problemy z używaniem tego ogranicznika we współczesnej aplikacji?

Obecnie robię to w aplikacji C++ nieobsługującej kodu Unicode, ale chciałbym się dowiedzieć, jak to ogólnie dotyczy innych języków, takich jak Java, C# i Unicode.

+0

Wikipedia ma [artykuł o ogranicznikach] (https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text), który opisuje te znaki. –

Odpowiedz

4

Dolna, 128-znakowa mapa ASCII jest w pełni osadzona w standardzie Unicode, w tym znaki 0-> 31. Jedynym powodem, dla którego nie używasz specjalnych znaków ASCII używanych w łańcuchach, jest po prostu z powodu ludzkich ograniczeń interfejsu: nie wyświetlają się dobrze (jeśli w ogóle), gdy są wyświetlane na ekranie lub zapisywane do pliku, a Ty nie możesz łatwo wpisz je z klawiatury. Nie można ich również używać w niezamkniętych formularzach w popularnych popularnych formatach plików, takich jak XML.

Dla zadań logicznego przetwarzania w programie, które nie wymagają interakcji użytkownika końcowego, są one jednak doskonale dostosowane do dowolnego wykorzystania. Twoje szczególne zastosowanie brzmi nowatorsko i wydajnie i myślę, że powinieneś zdecydowanie z nim pracować.

1

Twoja aplikacja może zaakceptować dowolny format binarny. Jeśli jednak musisz umieścić dowolne dane binarne w swoim wejściu, musisz uciec przed ogranicznikami lub innymi specjalnymi kodami, których używa twój format. Jest to prawda bez względu na to, które wybierzesz.

Nie ignorowałbym również Unicode. Już w 2012 roku jest dość głupio pracować z przestarzałym modelem radzenia sobie z tekstem. Jeśli twoje dane wejściowe są tekstowe, potraktuj je jako takie.

Jedna kwestia, która przychodzi do głowy, to dlaczego wymyślić inny format zamiast używać XML lub JSON; lub jeśli potrzebujesz kompaktowego kodowania, "binarnego" wariantu tych dwóch elementów (Fast Infoset, msgpack, kto wie co jeszcze) lub ASN.1? Prawdopodobnie pojawi się wiele innych problemów, które napotkasz podczas toczenia własnego, że projekt i narzędzia dla tych formatów zostały już rozwiązane.

+0

Ta odpowiedź mnie myli. (a) ASCII 29-31 są rzeczywiście znakami Unicode. Ich nazwy w Unicode to SEPARATOR INFORMACYJNY CZWARTY, TRZY, DRUGI i JEDEN (odpowiednio). (b) Używanie tych znaków nie jest [formatem binarnym] (https://en.wikipedia.org/wiki/Binary_format). (c) Używanie tych znaków nie wymyśla nowego formatu. Ich głównym celem jest ułatwienie wymiany danych, wyraźnie określone. –

+0

@BasilBourque A może, jeśli zapytasz o to rok temu, przypomniałbym sobie, o co mi chodziło, podając tę ​​odpowiedź. W tych dniach po prostu sprzeciwiłem się pytaniu o formę "czy są jakieś problemy?" nie opisując dobrze przypadku użycia, ponieważ jest niejasny. To powiedziawszy: twój komentarz był właściwie moim punktem widzenia. 'U + 0029' -'U + 0031' * są * poprawnymi znakami, a zatem mogą być obecne w samych wartościach znaków, używanie ich jako ogranicznika nie jest" bezpieczne ", chyba że określisz, co jest dozwolone. A w "formacie tekstowym" staram się zrozumieć, co jest racjonalnie możliwe do wpisania ręcznie. – millimoose

Powiązane problemy