2016-08-21 2 views
3

작은 프로그램을 실현하기 위해 녹 프로그래밍에 들어가고 있으며 문자열 변환에서 약간 분실했습니다.Vec <u16> 또는 Vec <WCHAR>을 & str으로 변환

let mut name: Vec<winnt::WCHAR> = Vec::new(); 

WCHAR 내 Windows 시스템에 u16과 동일 다음과 같이 내 프로그램에서

, 내가 벡터를 가지고있다.

저는 Vec<u16>을 포인터로 사용하여 데이터로 채 웁니다. 그런 다음 벡터에 포함 된 문자열을 &str으로 변환해야합니다. 그러나 아무리 노력해도이 변환 작업을 관리 할 수 ​​없습니다.

widestr = unsafe { WideCString::from_ptr_str(name.as_ptr()) }; 

그러나 이것은 잘못된 방향으로 단계가 될 것 같다 :

내가 작업을 얻을 수 있었다있는 유일한 방법은 WideString로 변환하는 것입니다.

Vec<u16>&str으로 변환하는 가장 좋은 방법은 벡터에 유효하고 Null로 끝나는 문자열이 들어 있다고 가정합니다.

답변

8

그런 다음 벡터에 포함 된 문자열을 &str으로 변환해야합니다. 그러나 아무리 노력해도이 변환 작업을 관리 할 수 ​​없습니다.

"자유로운"변환을 수행 할 방법이 없습니다.

&str은 UTF-8로 인코딩 된 유니 코드 문자열입니다. 이것은 바이트 위주의 인코딩입니다. UTF-16 (또는이 다르지만 공통 UCS-2 인코딩은 )이 있으면 다른 하나를 읽을 수있는 방법이 없습니다. 이는 JPEG 이미지를 PDF로 읽는 것과 같습니다. 두 데이터 청크 모두 문자열 일 수 있지만 인코딩이 중요합니다.

첫 번째 질문은 "정말로해야합니까?"입니다. 많은 경우 한 기능에서 데이터를 가져 와서 다른 기능으로 다시 가져올 수 있습니다. 당신이 그걸 잊어 버릴 수 있다면, 그것은 최선의 대답 일 것입니다.

을 변형해야하는 경우 발생할 수있는 오류를 처리해야합니다. 임의의 16 비트 정수 배열 이 유효한 UTF-16 또는 UCS-2가 아니어도됩니다. 이러한 인코딩에는 유효하지 않은 문자열을 쉽게 생성 할 수있는 가장자리가 있습니다. 널 종료는 또 다른 측면입니다. 실제로 유니 코드는 내장 된 NUL 문자를 허용하므로 null로 끝나는 문자열은 가능한 모든 유니 코드 문자를 포함 할 수 없습니다!

을 입력하고 입력 벡터에서 문자열을 구성하는 항목의 수를 파악한 후에는 입력 형식을 해독하고 출력 형식으로 다시 인코딩해야합니다. 이것은 어떤 종류의 새로운 할당을 필요로 할 것이므로 String으로 끝날 가능성이 가장 높습니다. 은 &str을 사용할 수있는 대부분의 곳에서 사용할 수 있습니다.

UTF-16 데이터를 문자열로 변환하는 기본 제공 방법이 있습니다 (String::from_utf16). 이러한 오류 사례를 허용하기 위해 Result을 반환합니다.String::from_utf16_lossy도 있는데, 이는 유효하지 않은 인코딩 된 부분을 유니 코드 대체 문자로 바꿉니다.

포인터에서 시작하여 또는 WCHAR으로 시작하는 경우 먼저 slice::from_raw_parts을 사용하여 슬라이스로 변환해야합니다. 널 종료 문자열이있는 경우 NUL을 찾아 입력을 적절히 분할해야합니다.


1 : 실제로 유형을 사용하는 좋은 방법입니다. &str이 UTF-8로 인코딩되도록 보장 된 이므로 더 이상 확인하지 않아도됩니다. 마찬가지로 WideCString은 건설 중 한 번 검사를 수행 한 다음 나중에 사용하는 경우 검사를 건너 뛸 수 있습니다.

+1

나를 도와 주셔서 고맙습니다. 분명히 완전히 잃어 버렸고 어떻게 든 두 가지 유형의 인코딩이 동일하다고 가정했습니다. 이 컨텍스트에서이 변환을 위해 다른 String 객체 (실제로 녹슬지 않는 객체라고도 함)를 사용하는 것이 합리적입니다. – Norbert

+2

@Norbert : 나는 물건을 객체 호출 여부에 대해 숙고하고 있는지 여부를 확신하지 못합니다. 모두가 방금 그 용어를 이해하므로 충분히 좋습니다 :) –

+0

@Norbert 예, 나는 그것이 당신이 "객체"라고 부르는 것에 달려 있다고 생각합니다. 데이터의 덩어리와 관련 메소드를 의미한다면, 그것은 객체입니다. 나는 보통 "클래스"대신에 "타입"을 말한 다음 "타입의 인스턴스"라고 말할 것이라고 생각합니다. 나는 종종 "대상"을 말할 필요가있는 자신을 발견하지 못했습니다. 나는 모두가 너를 잘 이해할 것이라고 생각한다. – Shepmaster

관련 문제