166 lines
3.1 KiB
C++
166 lines
3.1 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#include "sql/ob_sql_character_set.h"
|
|
#include <strings.h>
|
|
#include <stdio.h>
|
|
#include "share/ob_define.h"
|
|
namespace oceanbase
|
|
{
|
|
namespace sql
|
|
{
|
|
|
|
typedef struct CharacterSet
|
|
{
|
|
const char *name_;
|
|
int32_t number_;
|
|
} ObCharacterSet;
|
|
|
|
typedef struct CharacterSetR
|
|
{
|
|
int32_t number_;
|
|
const char *name_;
|
|
} ObCharacterSetR;
|
|
|
|
static const ObCharacterSet charset[] =
|
|
{
|
|
{"armscii8", 32},
|
|
{"ascii", 11},
|
|
{"big5", 1},
|
|
{"binary", 63},
|
|
{"cp1250", 26},
|
|
{"cp1251", 14},
|
|
{"cp1256", 57},
|
|
{"cp1257", 29},
|
|
{"cp850", 4},
|
|
{"cp852", 40},
|
|
{"cp866", 36},
|
|
{"cp932", 95},
|
|
{"dec8", 3},
|
|
{"eucjpms", 97},
|
|
{"euckr", 19},
|
|
{"gb2312", 24},
|
|
{"gbk", 28},
|
|
{"geostd8", 92},
|
|
{"greek", 25},
|
|
{"hebrew", 16},
|
|
{"hp8", 6},
|
|
{"keybcs2", 37},
|
|
{"koi8r", 7},
|
|
{"koi8u", 22},
|
|
{"latin1", 5},
|
|
{"latin2", 2},
|
|
{"latin5", 30},
|
|
{"latin7", 20},
|
|
{"macce", 38},
|
|
{"macroman", 39},
|
|
{"sjis", 13},
|
|
{"swe7", 10},
|
|
{"tis620", 18},
|
|
{"ucs2", 35},
|
|
{"ujis", 12},
|
|
{"utf8", 33}
|
|
};
|
|
|
|
static const ObCharacterSetR charsetR[] =
|
|
{
|
|
{1, "big5"},
|
|
{2, "latin2"},
|
|
{3, "dec8"},
|
|
{4, "cp850"},
|
|
{5, "latin1"},
|
|
{6, "hp8"},
|
|
{7, "koi8r"},
|
|
{10, "swe7"},
|
|
{11, "ascii"},
|
|
{12, "ujis"},
|
|
{13, "sjis"},
|
|
{14, "cp1251"},
|
|
{16, "hebrew"},
|
|
{18, "tis620"},
|
|
{19, "euckr"},
|
|
{20, "latin7"},
|
|
{22, "koi8u"},
|
|
{24, "gb2312"},
|
|
{25, "greek"},
|
|
{26, "cp1250"},
|
|
{28, "gbk"},
|
|
{29, "cp1257"},
|
|
{30, "latin5"},
|
|
{32, "armscii8"},
|
|
{33, "utf8"},
|
|
{35, "ucs2"},
|
|
{36, "cp866"},
|
|
{37, "keybcs2"},
|
|
{38, "macce"},
|
|
{39, "macroman"},
|
|
{40, "cp852"},
|
|
{57, "cp1256"},
|
|
{63, "binary"},
|
|
{92, "geostd8"},
|
|
{95, "cp932"},
|
|
{97, "eucjpms"},
|
|
};
|
|
|
|
int32_t get_char_number_from_name(const common::ObString &name)
|
|
{
|
|
int32_t ret = 0;
|
|
int32_t low = 0;
|
|
int32_t high = ARRAYSIZEOF(charset) - 1;
|
|
int cret = 0;
|
|
while (low <= high) {
|
|
ret = low + (high - low) / 2;
|
|
cret = name.case_compare(charset[ret].name_);
|
|
if (0 == cret) {
|
|
break;
|
|
} else if (0 > cret) {
|
|
high = ret - 1;
|
|
} else {
|
|
low = ret + 1;
|
|
}
|
|
}
|
|
|
|
if (low > high) {
|
|
ret = -1;
|
|
} else {
|
|
ret = charset[ret].number_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
const char *get_char_name_from_number(int32_t number)
|
|
{
|
|
const char *name = "gbk";
|
|
int32_t ret = 0;
|
|
int32_t low = 0;
|
|
int32_t high = ARRAYSIZEOF(charsetR) - 1;
|
|
while (low <= high) {
|
|
ret = low + (high - low) / 2;
|
|
if (charsetR[ret].number_ == number) {
|
|
break;
|
|
} else if (charsetR[ret].number_ > number) {
|
|
high = ret - 1;
|
|
} else {
|
|
low = ret + 1;
|
|
}
|
|
}
|
|
|
|
if (low > high) {
|
|
ret = -1;
|
|
} else {
|
|
name = charsetR[ret].name_;
|
|
}
|
|
return name;
|
|
}
|
|
}
|
|
}
|