Có phải an toàn là static const
trong chuỗi lớp học không? Trong mã bên dưới, tôi có trailingBytesForUTF8
là một mảng ký tự static const
. Có thể có nhiều luồng có thể hiện đối tượng riêng của chúng trong lớp CConvertUTF
. Sẽ có bất kỳ vấn đề trạng thái có thể thay đổi nào khi nhiều luồng truy cập cùng một mảng trailingBytesForUTF8
cùng một lúc hay bất kỳ vấn đề luồng nào khác không? Cũng lưu ý rằng các chuỗi sẽ không bao giờ chia sẻ cùng một cá thể đối tượng của lớp CConvertUTF
.static const char [] trong chủ đề lớp an toàn?
// .h
class CConvertUTF final
{
private:
static const char trailingBytesForUTF8[256];
public:
bool IsLegalUTF8Sequence(const char *source, const char *sourceEnd);
bool IsLegalUTF8(const char *source, int length);
};
// .cpp
const char CConvertUTF::trailingBytesForUTF8[256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
};
bool CConvertUTF::IsLegalUTF8Sequence(const char *source, const char *sourceEnd) {
int length = trailingBytesForUTF8[*source]+1;
if (source+length > sourceEnd) {
return false;
}
return IsLegalUTF8(source, length);
}
bool CConvertUTF::IsLegalUTF8(const char *source, int length) {
char a;
const *char = source+length;
switch (length) {
default: return false;
/* Everything else falls through when "true"... */
case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
case 2: if ((a = (*--srcptr)) > 0xBF) return false;
switch (*source) {
/* no fall-through in this inner switch */
case 0xE0: if (a < 0xA0) return false; break;
case 0xED: if (a > 0x9F) return false; break;
case 0xF0: if (a < 0x90) return false; break;
case 0xF4: if (a > 0x8F) return false; break;
default: if (a < 0x80) return false;
}
case 1: if (*source >= 0x80 && *source < 0xC2) return false;
}
if (*source > 0xF4) return false;
return true;
}
(Hmm Với 'const kiểm tra char [] = {0xA, 0xFF, 0xA};. IsLegalUTF8Sequence (kiểm tra, thử nghiệm + 3) ' là 'true'.) – aschepler
@aschepler Cảm ơn bạn đã gỡ lỗi, mã là mã nguồn mở cũ từ Unicode Inc. mà tôi vừa thêm một kiểu lập trình hướng đối tượng vào. –