텍스트 또는 바이트 문자열
좋은 날.
내가 지금 Haskell에 대해 싫어하는 것은 문자열 작업을위한 패키지의 양입니다.
처음에는 네이티브 Haskell [Char]
문자열을 사용했지만 해킹 라이브러리를 사용하려고했을 때 끝없는 변환으로 완전히 잃었습니다. 모든 패키지는 다른 문자열 구현을 사용하는 것처럼 보이며 일부는 자체 수작업을 채택합니다.
다음으로 Data.Text
문자열과 OverloadedStrings
확장자로 코드를 다시 작성 했습니다 Text
. 더 넓은 함수 세트를 가지고 있기 때문에 선택 했지만 많은 프로젝트에서 ByteString
.
누군가가 왜 하나 또는 다른 것을 사용 해야하는지 짧은 추론을 줄 수 있습니까?
PS : BTW 어떻게 변환하는 방법 Text
에 ByteString
?
예상 유형 Data.ByteString.Lazy.Internal.ByteString 을 유추 된 유형 텍스트 와 일치시킬 수 없습니다. 예상 유형 : IO Data.ByteString.Lazy.Internal.ByteString 유추 된 유형 : IO 텍스트
encodeUtf8
에서 시도 Data.Text.Encoding
했지만 운이 없습니다.
유추 된 유형 Data.ByteString.Internal.ByteString 에 대해 예상 유형 Data.ByteString.Lazy.Internal.ByteString 을 일치시킬 수 없습니다.
UPD :
* Chunks goodness가 갈 길처럼 보이지만 결과에 다소 충격을 받았으며 원래 기능은 다음과 같습니다.
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
그리고 이제 :
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
where
toLazyBS t = fromChunks [encodeUtf8 t]
fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
그리고 예,이 기능은 작동하지 않습니다. 왜냐하면 우리 Text
가 그것을 제공한다면 이 텍스트가 적절하게 인코딩되고 사용할 준비가되어 있고 변환하는 것은 어리석은 일이라고 확신합니다. 그러나 그런 장황한 변환은 여전히 외부 어딘가에 두십시오 htmltoItems
.
ByteStrings
주로 바이너리 데이터에 유용하지만 ASCII 문자 세트 만 있으면 텍스트를 처리하는 효율적인 방법이기도합니다. 유니 코드 문자열을 처리해야하는 경우 Text
. 그러나 둘 다 다른 것을 대체하는 것이 아니며 일반적으로 다른 용도로 사용된다는 점을 강조해야합니다. Text
순수 유니 코드 를 나타내지 만 ByteString
소켓이나 파일을 통해 텍스트를 전송할 때마다 이진 표현 으로 인코딩해야 합니다. .
다음은 유니 코드 코드 포인트 ( Text
)와 인코딩 된 바이너리 바이트 ( ByteString
) 의 관계를 설명하는 적절한 작업을 수행하는 유니 코드의 기본에 대한 좋은 기사입니다 . 모든 소프트웨어 개발자는 절대적으로 유니 코드 및 문자에 대해 알아야합니다. 세트
Data.Text.Encoding 모듈을 사용하여 두 데이터 유형간에 변환하거나 지연 변형을 사용하는 경우 Data.Text.Lazy.Encoding 을 사용할 수 있습니다 (오류 메시지를 기반으로하는 것처럼 보임 ).
텍스트 데이터에 Data.Text를 사용하고 싶을 것입니다.
encodeUtf8
갈 길입니다. 이 오류 :
유추 된 유형 Data.ByteString.Internal.ByteString에 대해 예상 유형 Data.ByteString.Lazy.Internal.ByteString을 일치시킬 수 없습니다.
게으른 바이트 문자열 을 예상하는 코드에 엄격한 바이트 문자열을 제공하고 있음을 의미합니다 . 다음 기능으로 변환이 쉽습니다 .fromChunks
Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
그래서 여러분이해야 할 일은 fromChunks [myStrictByteString]
게으른 바이트 문자열이 예상되는 곳에 함수를 추가하는 것 입니다.
다른 방법으로 변환은 toChunks
지연 바이트 문자열을 취하고 엄격한 청크 목록을 제공하는 dual 함수로 수행 할 수 있습니다 .
일부 패키지의 관리자에게 바이트 문자열 인터페이스 대신 또는 추가로 텍스트 인터페이스를 제공 할 수 있는지 물어볼 수 있습니다.
에서 단일 함수 cs
를 사용합니다 Data.String.Conversions
.
입력 및 예상 유형에 따라 String
, ByteString
및 Text
( ByteString.Lazy
및 및 Text.Lazy
) 간에 변환 할 수 있습니다.
You still have to call it, but no longer to worry about the respective types.
See this answer for usage example.
참고URL : https://stackoverflow.com/questions/7357775/text-or-bytestring
'developer tip' 카테고리의 다른 글
JNI 프로젝트에서 UnsatisfiedLinkError (종속 라이브러리를 찾을 수 없음)를 수정하는 방법 (0) | 2020.10.17 |
---|---|
TeamCity는 MSBuild 단계에서 "/ property :"대신 "Build Parameters"를 사용한다고 말합니다. (0) | 2020.10.17 |
PackagesNotFoundError : 다음 패키지는 현재 채널에서 사용할 수 없습니다. (0) | 2020.10.17 |
웹 애플리케이션 모니터링 모범 사례 (0) | 2020.10.17 |
Git 서브 모듈의 대안? (0) | 2020.10.17 |