在PostgreSQL C语言函数中更改字符编码

时间:2017-11-16 01:51:33

标签: c postgresql utf-8 multibyte

我在Windows服务器上使用PostgreSQL 9.5 64位版本。 数据库的字符编码设置为UTF8。

我想创建一个操作多字节字符串的函数。 (例如清洁,更换等)

我复制了C语言逻辑来操纵其他系统中的字符, 该逻辑假设字符代码是sjis。

我不想改变C语言逻辑,所以我想在Postgresql的C语言函数中将UTF8转换为sjis。 像convert_to函数一样。 (但是,由于convert_to函数返回bytea类型,我想用TEXT类型获取它。)

请告诉我如何使用C语言将UTF 8转换为sjis。

创建函数脚本:

mvc
    .perform(
        post("/some/endpoint")
            .param("listOfEnums", String.valueOf(SomeEnum.SOMEENUMCONSTANT), String.valueOf(SomeEnum.SOMEOTHERENUMCONSTANT))
            .param("id", "100")

C来源:

CREATE FUNCTION CLEANSING_STRING(character varying)
RETURNS character varying AS
'$libdir/MyFunc/CLEANSING_STRING.dll', 'CLEANSING_STRING'
LANGUAGE c VOLATILE STRICT;

1 个答案:

答案 0 :(得分:1)

成功地通过问题评论教导我。

#include <mb/pg_wchar.h> //Add to include.

...

Datum CLEANSING_STRING(PG_FUNCTION_ARGS)
{

    // Get Arg
    text *arg1 = (text *)PG_GETARG_TEXT_P(0);

    // Text to Char[]
    char *arg;
    arg = text_to_cstring(arg1);

    // UTF8 to Sjis
    Char *sjisChar[] = pg_server_to_any(arg, strlen(arg), PG_SJIS);

    // Copied from other system.(Assumes that the character code is sjis.)
    cleansingString(sjisChar);
    replaceStrimg(sjisChar);

    // Sjis to UTF8
    arg =  pg_any_to_server(sjisChar, strlen(sjisChar), PG_SJIS); //It converts from SJIS to server (UTF 8), the third argument sets the encoding of the conversion source.

    //Char[] to Text and Return
    PG_RETURN_TEXT_P(cstring_to_text(arg));
}