2012-08-02 4 views
3

우선, 안녕하세요, 이것은 내 첫 번째 게시물입니다!C# 읽는 방법 r n 문자열

직렬 포트를 읽고 쓰는 응용 프로그램을 작성 중입니다. 모두 잘 작동하지만 회사에 따라 다른 유형의 스캐너가 있기 때문에 서로 다른 접두사/접미사 문자로 구성되어 있습니다. \ r \ n 시퀀스. 내가 XML 파일을 읽어

<rPortSuffix>\r\n</rPortSuffix> 

, 나는 때,이

case "rPortSuffix": 
    srPortSuffix = xmlReader.Value; 
break; 

문제는 사용

그래서 난 내 XML 설정 파일에이 접미사를 포함과 같이하기로 결정 텍스트 값이 "\ r \ n"대신 srPortSuffix에 전달되고 변수에 "\\ r \\ n"이 저장되므로 직렬 포트를 읽으려고 할 때 잘못된 접미사 문자열로 인해 아무런 반응이 없습니다. NewLine 상수)

그래서 나는 시도 :

srPortSuffix= Regex.Replace(srPortSuffix, @"\\", @"\"); 

그러나 성공하지. 어떤 팁?

TL; DR

는 어떻게 만들 수 있습니다 "\ 연구 \ n"XML 파일에서 읽을 값은 대신 "\\ R \\ n"은의, 정확히처럼 읽을 수?

편집 : 지금 내 응용 프로그램입니다

<rPortSuffix>&#13;&#10;</rPortSuffix> 

그리고 : 지르 카 HANIKA에 의해 제안, 단순히 위해 "\ r \ n"을 아스키 코드로, 같은에서 내 문자열을 변경

나는 2 종류의 스캐너를 시험해보고있다.

감사합니다.

+0

새로운 라인 문자에 대한 ASCII 코드를 저장하고 코드의 실제 문자를 구문 분석 할 수있다. 그냥 생각. – Justin

+0

stringbuilder를 사용 하시겠습니까? 아마도 StringBuilder.AppendLine(); 기본적으로 stringBuilder의 변수에 데이터를 저장하고 각 행에 \ r \ n을 추가합니까? – plast1K

+3

값은 아마도'\ r \ n '이지만, 디버거에서 변수를 볼 때 변수를 빠져 나옵니다. – SwDevMan81

답변

5

실제 문자열 데이터를 C# 소스 코드로 표현하는 방법과 혼동을 줄 수 있습니다. 물론 C# 구문은 XML 파일에 적용되지 않으므로 \r\n은 개행 시퀀스와 관련이 없습니다.

표시된 코드로는 \\r\\n으로 변환되지 않지만 줄 바꿈 시퀀스로 변환되지 않습니다.

후자를하는 가장 간단한 방법은 다음과 같습니다

srPortSuffix = srPortSuffix.Replace(@"\r", "\r").Replace(@"\n", "\n"); 

당신은 기본적으로 있지만 완전히 어떤 C#을 소스의 외부는 C# 컴파일러는 일반적으로 당신을 위해하는 일을 할 것입니다. 예쁜 인쇄 규칙을

<rPortSuffix> 
</rPortSuffix> 

이 그러나 일부 독자들이 오해 할 수 및/또는 휴식 :

는 아무것도 변환하고 간단하게 직접 XML 파일에 줄 바꿈 순서를 넣어하지 않는 훨씬 더 쉽게 다른있다 (종료 태그는 들여 쓰기되지 않습니다).같은 것을 XML로 작성하는 더 진부하지만 더 실용적인 방법 :

<rPortSuffix>&#13;&#10;</rPortSuffix> 
+0

이 작품! 더 나은 접근 방법처럼 들리므로 지금 ASCII 코드로 처리하려고합니다. – desto

+0

@desto - ASCII 코드에 의존하는 한 가지 방법을 추가 했으므로 코드를 변경하지 않아도됩니다. –

+0

미안하지만, 나는 그것을보고 구현했지만 여기에서 회신하는 것을 잊어 버렸습니다. 다른 스캐너가 다른 문자를 사용함에 따라이 작업을 수행하게됩니다. – desto

2

나는 약간의 오해가 당신의 접근법에 있다고 생각한다. \r\n은 캐리지 리턴과 새 줄을 순서대로 나타내는 "기호"입니다. 이 "심볼"(또는 그룹)은 컴파일러에만 유효합니다. 런타임 코드에서도 마찬가지입니다.

컴파일러가 컴파일시에 이진 표현으로 변환합니다.

{ 0xD, 0xA } 

이 (... 문자열 배열입니다 여기에 함축하지 내가 문자열에 저장하는 방법을 아무 생각이 : 그래서, 당신이 할 때

var str = "\r\n"; 

컴파일러는 실제로 뭔가를 저장합니다. 인터넷, 도망 가야)

따라서 컴파일러는 '코드'를 해석하고 다른 것으로 변환합니다. 내 의견은 여기에있다. 컴파일러를 (런타임에서 값을 읽음으로써) 방정식에서 꺼내고 있기 때문에, 당신은 그 일을해야한다.

그래서,이 이론적 근거를 다음, 나는 설정 파일의 내용을 읽을 것이다 다음 "해석"이라고 : 물론

if (srPortSuffix == "\\\\r\\\\n") 
{ 
    actualPortSuffix = "\r\n"; 
} 

을,이 모든 대표이기 때문에, 내가 믿는 것은 더 나은 될 것입니다 접근법은 새로운 라인을 표현하기 위해 다른 표현식을 사용하는 것입니다. 구성은 다음과 같이 읽을 수 있습니다 :

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix> 

어느 것이 더 명확합니다. 코드에서, 당신은 할 것이다 :

if (srPortSuffix == "CarriageReturn-NewLine") 
{ 
    actualPortSuffix = "\r\n"; 
} 
관련 문제