일반 텍스트에서 가장 적게 사용 된 구분 문자 <ASCII 128


81

당신을 놀라게 할 코딩 이유 때문에 (말하기에는 너무 부끄럽습니다) 여러 텍스트 항목을 단일 문자열에 저장해야합니다.

문자를 사용하여 구분하겠습니다.

이를 위해 어떤 문자를 사용하는 것이 가장 좋습니까? 즉, 텍스트에 나타날 가능성이 가장 적은 문자는 무엇입니까? 로케일 문제를 방지하려면 인쇄 가능해야하며 ASCII에서 128 미만이어야합니다.


44
부끄러워하지 마세요. "오, 그게 엉터리 야, 대신 이걸 해"라고 말하는 모든 사람들을 무시해야합니다. 응답자가 이유에 대해 질문하는 것이 아니라 방법에 대해 대답하는 것입니다. 나는 당신이 왜이 위치에 있는지 상관하지 않습니다. 나도 몇 안 됐어. 행운을 빕니다!
Iain 홀더

1
나는 같은 문제가 있었다. 그리고 나는 인터넷 검색이나 스택 넘침 전에 PIPE와 함께 갔다. 왜냐하면 나는 그것이 마른 사람처럼 보이는 방식을 좋아했기 때문이다.

1
텍스트의 종류에 따라 다릅니다. 어떤 종류의 텍스트는 탭 문자를 거의 사용하지 않기 때문에 자주 사용합니다. 그러나 소스 코드를 포함한 다른 종류의 텍스트는 종종 그것을 사용합니다. 소스 텍스트에 대한 통계를 할 수 없습니까? 소스 텍스트에 이스케이프 문자를 추가하여 원하는 것을 구분 기호로 사용할 수 없습니까?
hippietrail

묻지 않고 시도하지 않는 것은 어떤 종류의 질문을하는 것이 창피한 것보다 훨씬 더 나쁩니다. 나는 같은 질문의 대답을 여기에, 그리고 난 내가 :) 저와 같은 문제를 공유하는 다른 사람들이 자랑스럽게 자신의 생각
테오 만 shipahi

|텍스트에 a가있을 수있는 사람들을 위해 실제로 문자를 가능한 한 최소화해야하는 경우가있었습니다. 흥미로운 텍스트가있는 문자열이있는 대부분의 필드 때문에 CSV는 많은 이스케이프로 인해 작동하지 않았습니다. 필드 구분자는입니다 /|. 슬래시는 적당히 흔하지 만 결코 만나지 않는 파이프와 쌍을 이룹니다. 나는 매일 많은 데이터를 전달받는 엔진을 사용하고 있습니다. 이것은 결코 깨지지 않았으며 단일 문자열을 캡슐화하거나 특수 문자를 이스케이프 할 필요가 없습니다. 평균적으로이 메커니즘은 텍스트의 몇 퍼센트를 절약했습니다.
RLH

답변:


34

당황스러운 이유로 CSV를 사용할 수 없다고 가정하면 데이터를 사용한다고 말하고 싶습니다. 샘플 데이터를 가져와 각 값 0-127에 대해 간단한 문자 수를 계산합니다. 발생하지 않는 것 중 하나를 선택하십시오. 선택의 여지가 너무 많으면 더 큰 데이터 세트를 얻으십시오. 글을 쓰는 데 많은 시간이 걸리지 않으며 가장 적합한 답변을 얻을 수 있습니다.

문제 영역에 따라 대답이 달라 지므로 | (파이프)는 셸 스크립트에서 일반적이고 ^는 수학 공식에서 일반적이며 대부분의 다른 문자에서도 마찬가지입니다.

나는 개인적으로 내가 갈 것이라고 생각한다 | (파이프) 선택권이 주어지면 실제 데이터를 사용하는 것이 가장 안전합니다.

그리고 무엇을하든 탈출 계획을 세웠는지 확인하십시오!


나는 여기서 조롱하지 않을 것입니다. magento 2 제품 내보내기에서 여러 속성을라는 csv의 단일 열로 병합합니다 additional_attributes.
스티븐

1
텍스트의 모든 탭 문자를 공백 4 개로 바꾸고 \t구분 기호로 탭 문자 를 사용하지 않는 이유는 무엇 입니까?
Elie G.

35

"Unit Separator"ASCII 코드 "US"를 선택합니다 : ASCII 31 (0x1F)

예전에는 대부분의 작업이 무작위 액세스없이 연속적으로 수행되었습니다. 이것은 몇 가지 제어 코드가 ASCII에 포함되었음을 의미합니다.

ASCII 28 (0x1C) File Separator - Used to indicate separation between files on a data input stream.
ASCII 29 (0x1D) Group Separator - Used to indicate separation between tables on a data input stream (called groups back then).
ASCII 30 (0x1E) Record Separator - Used to indicate separation between records within a table (within a group).  These roughly map to a tuple in modern nomenclature.
ASCII 31 (0x1F) Unit Separator - Used to indicate separation between units within a record.  The roughly map to fields in modern nomenclature.

Unit Separator는 ASCII 형식이며이를 표시하기위한 유니 코드 지원 (일반적으로 동일한 글리프의 "us")이 있지만 많은 글꼴에서 표시하지 않습니다.

표시해야하는 경우 필드로 구문 분석 된 후 응용 프로그램에 표시하는 것이 좋습니다.


1
우와, 고마워요. 이것이 바로 제가 찾고 있던 것이 었습니다.
Theunis

22

아마 | 또는 ^ 또는 ~ 두 문자를 결합 할 수도 있습니다.


10
두 번 사용하면 오해를 방지 할 수 있습니다. 처럼 || 또는 ##
roel 2015 년

17

다른 언어를 사용하는 경우이 기호 : ¬

최고로 입증되었습니다. 그러나 나는 여전히 테스트 중입니다.


1
이 아이디어가 마음에 들지만 "Billy"¬ "Car"¬ "Red"¬ "Garage"¬ "3"와 같은 문자열이 포함 된 파일을 작성하고 cut을 사용할 수 있는지 궁금합니다. (예 : $ cut -d "¬"-f1 myfile.delim)
blehman

이 질문을 여기에 추가했습니다. stackoverflow.com/questions/19821639/…
blehman

15

"인쇄 가능"이라고 말했지만 탭 (0x09) 또는 용지 공급 (0x0c)과 같은 문자를 포함 할 수 있습니다. 쉼표가 때때로 텍스트에 나타날 수 있기 때문에 나는 거의 항상 쉼표 대신 탭을 선택합니다.

(흥미롭게도 ascii 테이블 에는 그룹, 레코드 및 단위 구분 기호에 대해 GS (0x1D), RS (0x1E) 및 US (0x1F) 문자가 있습니다.

"인쇄 가능"이란 사용자가 인식하고 쉽게 입력 할 수있는 문자를 의미하는 경우 파이프 | 기호 먼저, 몇 가지 다른 이상한 문자 ( @또는 ~또는 ^또는 또는 \여기에 입력 할 수없는 백틱)를 가능성으로 사용합니다. 이러한 문자 +=!$%&*()-'":;<>,.?/는 사용자 입력에서 발생할 가능성이 더 높은 것처럼 보입니다. 밑줄 _과 해시 #{}[]내가 모르는 괄호에 관해서는 .


14
표준 ASCII 코드 테이블에는 위에서 Jason S가 언급 한 것처럼 이러한 목적으로 특별히 설계된 4 개의 제어 코드가 포함되어 있습니다. 그들은 : 28 FS파일 구분, 29 GS그룹 구분, 30 RS기록 구분, 31 US단위 구분. 불행히도, 그것이 정확히 의도 된 것이지만 거의 아무도 사용하지 않습니다. 개인적으로 저는 CSV 형식 파일을 싫어합니다. 왜냐하면 너무 많은 사람들이 생각하지 않고 프로그래머가 파일 형식을 지원하려면 처리해야하는 엉망이되기 때문입니다.
deegee

3
@deegee 아마도 여기에서 가장 좋은 대답입니다. 데이터에 바이너리 또는 비표준 ASCII / 유니 코드가 포함되어 있지 않으면 항상 모든 언어에서 작동합니다. 이것을 일반 답변으로 바꿔야합니다.
dhj

@rahul 당신은 이것을 받아 들인 대답으로 표시 할 권한이 있습니까? 쓰레기로 가득 찬 사용자 입력 데이터를 처리 할 때 가장 유용합니다. 기타 참고 사항 : Windows에서 US (0x1F)를 얻으려면 Alt + 31을 누르십시오.
golfalot

14

CSV 스타일 형식을 사용하는 것은 어떻습니까? 문자는 표준 CSV 형식으로 이스케이프 될 수 있으며 이미 많은 파서가 작성되어 있습니다.


나는 내 생각보다 이것을 더 좋아한다. +1.
Iain 홀더

쉼표는 일반 텍스트에서 일반적인 문자로 간주됩니다. CSV를 사용하는 것만 큼 간단하다면 질문 할 필요가있을 것
Jay

csv는 일반 텍스트의 쉼표와 몇 가지 다른 문제를 다룹니다. 따라서 텍스트에 쉼표가 모두 준비되어 있는지는 중요하지 않습니다. IIRC는 텍스트를 따옴표로 묶고 따옴표를 이스케이프합니다.
Jeremy French

@Jeremy : 정확히 맞습니다. 다음은 이스케이프 체계의 작동 방식을 언급하는 위키피디아 기사입니다. en.wikipedia.org/wiki/Comma-separated_values
rmeador

1
솔직히 말하면 CVS는 생각하지 못한 모든 문제를 처리하고 예상치 못한 입력으로 인해 중단되기 때문에 2 주마다 "솔루션"을 고칠 필요가 없도록합니다.
Aaron Digulla

9

파이프 기호를 사용할 수 있습니까? 일반적으로 쉼표 또는 탭으로 구분 된 문자열 다음으로 가장 일반적인 구분 기호입니다. 대부분의 텍스트에 파이프가 포함될 가능성은 거의 없으며 ord ( '|')는 나를 위해 124를 반환하므로 요구 사항에 맞는 것 같습니다.


8

빠른 이스케이프를 위해 다음과 같은 것을 사용합니다. str1, str2 및 str3을 연결하고 싶다고 가정 해 보겠습니다.

delimitedStr=str1.Replace("@","@a").Replace("|","@p")+"|"+str2.Replace("@","@a").Replace("|","@p")+"|"+str3.Replace("@","@a").Replace("|","@p");

그런 다음 원래 사용을 검색하려면 :

splitStr=delimitedStr.Split("|".ToCharArray());
str1=splitStr[0].Replace("@p","|").Replace("@a","@");
str2=splitStr[1].Replace("@p","|").Replace("@a","@");
str3=splitStr[2].Replace("@p","|").Replace("@a","@");

참고 : 교체 순서가 중요합니다.

깨지지 않고 구현하기 쉽습니다.


2
이것은 정말로 여기에서 가장 좋은 대답이며 유일한 올바른 imo입니다. 깨질 수없는 유일한 답입니다. 다른 모든 답변은 입력이 형식을 깨뜨릴 확률을 낮추지 만 이것은 매우 좋지 않은 접근 방식입니다. 선택된 대답은 이와 같은 이스케이프 체계를 사용하는 것에 대해 올바르게 말하지만 일단 구분 기호를 선택하면 본질적으로 관련이 없습니다.
Alfie

구분 기호는 그다지 중요하지 않습니다. 일반적인 문자 (공백 또는 "e")를 선택하면 이스케이프 된 문자열이 실제로 길어지고 읽기가 어렵습니다. 흔하지 않은 캐릭터를 선택하는 것이 가장 좋습니다. 이것이 제가 여전히 이런 종류의 파이프 기호를 선호하는 이유입니다.
fool4jesus jul.


2

우리는 의사 인쇄가 가능하고 정기적으로 거의 사용되지 않는 ascii 0x7f를 사용합니다.


2

상황과 언어에 따라 좋을 수도 있고 나쁠 수도 있지만 (일반적으로 나쁠 수도 있지만) 항상 모든 것을 Base64로 인코딩 할 수 있습니다. 그런 다음 각 측면에서 다양한 패턴을 이스케이프 및 이스케이프 해제하는 것에 대해 걱정할 필요가 없으며 Base64 문자 집합에서 사용되지 않는 문자를 기반으로 문자열을 간단히 분리하고 분할 할 수 있습니다.

XML 문서를 XML 속성 / 노드에 넣을 때이 솔루션에 의존해야했습니다. 속성에는 CDATA 블록이 전혀 포함될 수 없으며 CDATA로 이스케이프 된 노드는 구조를 깨지 않고는 그 내부에 추가 CDATA 블록을 가질 수 없습니다.

하지만 CSV는 대부분의 상황에서 더 나은 아이디어 일 것입니다.


base64 인코딩은 간단한 솔루션이지만 CSV가 사용되는 주된 이유는 텍스트를 재분석 할 필요가 없기 때문입니다. base64를 사용하면 자체 형식을 완전히 발명 할 수 있습니다.
롤백

1

글쎄, 그것은 당신의 텍스트의 성격에 어느 정도 의존 할 것이지만 세로 막대 0x7C는 텍스트에서 자주 나타나지 않습니다.


1

자연 텍스트에서 앰퍼샌드 다음에 쉼표가 오는 것을 본 적이 없다고 생각하지만 먼저 파일에 구분 기호가 포함되어 있는지 확인하고 그렇다면 대체를 사용할 수 있습니다. 사용하는 구분 기호가 충돌을 일으키지 않는다는 것을 항상 알고 싶다면 원하는 구분 기호가 있는지 파일을 확인하는 루프를 수행하고 존재하는 경우 파일이 더 이상 일치하지 않을 때까지 문자열을 두 배로 늘립니다. . 프로그램이 정확한 구분 기호 일치 만 검색하므로 유사한 문자열이 있는지 여부는 중요하지 않습니다.


1

파이프와 캐럿 모두 확실한 선택입니다. 사용자가 전체 응답을 입력 할 것으로 예상되는 경우 캐럿은 파이프보다 키보드에서 찾기가 더 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.