我在http://androidxref.com/4.0.4/xref/frameworks/base/media/libmedia/MediaScannerClient.cpp#95
中阅读了以下代码static uint32_t possibleEncodings(const char* s)
{
uint32_t result = kEncodingAll;
// if s contains a native encoding, then it was mistakenly encoded in utf8 as if it were latin-1
// so we need to reverse the latin-1 -> utf8 conversion to get the native chars back
uint8_t ch1, ch2;
uint8_t* chp = (uint8_t *)s;
while ((ch1 = *chp++)) {
if (ch1 & 0x80) {
ch2 = *chp++;
ch1 = ((ch1 << 6) & 0xC0) | (ch2 & 0x3F);
// ch1 is now the first byte of the potential native char
ch2 = *chp++;
if (ch2 & 0x80)
ch2 = ((ch2 << 6) & 0xC0) | (*chp++ & 0x3F);
// ch2 is now the second byte of the potential native char
int ch = (int)ch1 << 8 | (int)ch2;
result &= findPossibleEncodings(ch);
}
// else ASCII character, which could be anything
}
return result;
}
为什么要使用上述逻辑将latin-1反转为utf8?