그래서 스크립팅 언어를 작성 중이며 편리한 목표 중 하나는 문자열 작업입니다. 나는 C++에서 몇 가지 아이디어를 시도했다.C++ 유니 코드 : 바이트, 코드 포인트 및 Graphem
- 문자열은 코드 포인트 색인을 포함하는 벡터를 반환하는 바이트 및 자유 함수 시퀀스입니다.
- 문자열과 인덱스가 포함 된 벡터를 결합하는 래퍼 클래스입니다.
두 아이디어 모두에 문제가 있으며 그 문제는 내가 무엇을 반환해야하는지입니다. char가 될 수는 없으며, 문자열이라면 공간이 낭비 될 것입니다.
정확하게 4 바이트의 문자 배열 주위에 래퍼 클래스를 만들었습니다. 정확히 4 바이트의 메모리가 있고 그 이하도 아닌 문자열입니다.
이 클래스를 생성 한 후에 다른 클래스의 std::vector
에 다른 클래스로 감싸서 빌드하면 코드 유형이 문자열 유형이됩니다. 나는 이것이 좋은 접근법인지 모른다. 훨씬 더 편리하게 끝나지 만 더 많은 공간을 낭비하게 될 것이다.
그래서 코드를 게시하기 전에보다 체계적인 아이디어 목록을 작성하십시오.
- 내 캐릭터 유형은 바이트도 아니고 코드 포인트 일 수도 있습니다. 나는 그것을 Go 언어의 것과 같은 룬 (rune)이라고 명명했다.
- 일련의 분해 된 룬으로 구성된 문자열로, O1의 색인 생성 및 조각화를 수행합니다.
- 룬은 이제 기본 클래스가 아니기 때문에 유니 코드 공백을 감지하는 방법으로 확장 될 수 있습니다.
mysring[0].is_whitespace()
- 그래 펜은 어떻게 처리해야할지 모르겠군요.
호기심 사실! 룬 클래스의 프로토 타입을 만드는 방법에 관한 이상한 점은 항상 UTF8로 인쇄된다는 것입니다. 내 룬은 int32가 아니기 때문에 4 바이트 문자열이므로 흥미로운 속성이 있습니다.
내 코드 :
class rune {
char data[4] {};
public:
rune(char c) {
data[0] = c;
}
// This constructor needs a string, a position and an offset!
rune(std::string const & s, size_t p, size_t n) {
for (size_t i = 0; i < n; ++i) {
data[i] = s[p + i];
}
}
void swap(rune & other) {
rune t = *this;
*this = other;
other = t;
}
// Output as UTF8!
friend std::ostream & operator <<(std::ostream & output, rune input) {
for (size_t i = 0; i < 4; ++i) {
if (input.data[i] == '\0') {
return output;
}
output << input.data[i];
}
return output;
}
};
오류 처리 아이디어 : 나는 C++에서 예외를 사용하고 싶지 않아요
. 내 생각에, 생성자가 실패하면 룬을 4 '\0'
으로 초기화 한 다음 실행의 첫 번째 바이트가 '\0'
일 경우 bool 연산자를 명시 적으로 오버로드하여 false를 반환합니다. 간단하고 사용하기 쉽습니다.
그래서 생각은? 의견? 다른 접근법?
룬 문자열이 많은 경우에도 적어도 룬 문자 유형이 있습니다. 작고 빠른 복사. :)
왜 "룬"을 저장하기 위해'char32_t'를 사용하지? –
어떻게 사용합니까? 지난 번에 내가 그곳에 대한 많은 정보가 없다는 것을 확인했습니다. –
[char32_t] (http://en.cppreference.com/w/cpp/language/types) "형식으로 UTF-32 문자 표현을 입력해야하며 UTF-32 코드 단위 (32 비트)를 나타낼만큼 충분히 커야합니다. 그것은'std :: uint_least32_t'와 같은 크기, 부호, 정렬을 가지고 있지만 구별되는 형식입니다. " –