internal int GetCodePage(SqlCollation collation, TdsParserStateObject stateObj)
{
int codePage = 0;
if (0 != collation.sortId)
{
codePage = TdsEnums.CODE_PAGE_FROM_SORT_ID[collation.sortId];
Debug.Assert(0 != codePage, "GetCodePage accessed codepage array and produced 0!, sortID =" + ((Byte)(collation.sortId)).ToString((IFormatProvider)null));
}
else
{
int cultureId = collation.LCID;
bool success = false;
try
{
codePage = Locale.GetCodePageForLcid(cultureId);
// SqlHot 50001398: CodePage can be zero, but we should defer such errors until
// we actually MUST use the code page (i.e. don't error if no ANSI data is sent).
success = true;
}
catch (ArgumentException)
{
}
// If we failed, it is quite possible this is because certain culture id's
// were removed in Win2k and beyond, however Sql Server still supports them.
// In this case we will mask off the sort id (the leading 1). If that fails,
// or we have a culture id other than the cases below, we throw an error and
// throw away the rest of the results.
// Sometimes GetCultureInfo will return CodePage 0 instead of throwing.
// This should be treated as an error and functionality switches into the following logic.
if (!success || codePage == 0)
{
switch (cultureId)
{
case 0x10404: // zh-TW
case 0x10804: // zh-CN
case 0x10c04: // zh-HK
case 0x11004: // zh-SG
case 0x11404: // zh-MO
case 0x10411: // ja-JP
case 0x10412: // ko-KR
// If one of the following special cases, mask out sortId and
// retry.
cultureId = cultureId & 0x03fff;
try
{
codePage = Locale.GetCodePageForLcid(cultureId);
success = true;
}
catch (ArgumentException)
{
}
break;
case 0x827: // Mapping Non-supported Lithuanian code page to supported Lithuanian.
try
{
codePage = Locale.GetCodePageForLcid(0x427);
success = true;
}
catch (ArgumentException)
{
}
break;
default:
break;
}
if (!success)
{
ThrowUnsupportedCollationEncountered(stateObj);
}
Debug.Assert(codePage >= 0, string.Format("Invalid code page. codePage: {0}. cultureId: {1}", codePage, cultureId));
}
}
return codePage;
}