您的位置:68399皇家赌场 > 集群主机 > c#调用dll接口传递utf-八字串方法,

c#调用dll接口传递utf-八字串方法,

发布时间:2019-05-10 05:49编辑:集群主机浏览(141)

    1. 起

    c#调用dll接口传递utf-八字串方法,

    1. 起

    VCU10之录制下载模块,接纳纯python编码达成,c 代码调用pythonrun.h配置python运营意况运维python模块,编译为dll给c#调用,以使分界面UI能够使用在这之中功用。

    永不问怎么不用IronPython,它不是正统Python,且下载模块亦要为Mac产品所用。

    困难难题!用去一天时间屡屡打字与印刷日志,验证所传字串差异,以期待开掘题目定位难点,直至下班前始有灵感。

    证实开采,非中文字符能够健康下载,中文字符下载剖析失利,当时即想到大概是字串不合并所致,就在python代码试遍字串编码转变,均不奏效。

    原接口封装代码如下:

        [DllImport("VideoDownloader", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        private extern static bool VDDownload(IntPtr instance, string savePath, string imageSavePath,
            string quality, string ext, string subtitleLang);
    

    比如传savePath为[d:vcu新],dll调用python模块,打字与印刷其编码消息:

    print 'dir: '   dir   ', code: '   repr(dir))
    

    则打字与印刷日志为:

    dir: d:kvd新, code: 'd:\kvdxd0xc2'
    

    而一贯运维python代码,其出口却是:

    dir: d:kvd新, code: 'd:\kvdxe6x96xb0'
    

    用c#建德姆o用Encoding反分析验知xd0xc2为[新]字的gb2312编码,xe6x96xb0为[新]字的utf-8编码。

     

     

    二、字串编码

    Win七 陆10个人简体普通话版中c#的暗中认可编码:

    皇家赌场 1

    做那样不难表明,开掘其私下认可编码为gb231二;而所用python代码,为兼任中文等多字节字符,暗许使用utf-八编码。

    难题基本上就在此地了,dll接口字串传递格局,需改为utf-8字串举行传递,但c#嵌入未有utf-8封装器,自定义完成它。

     

     

    3、UTF8Marshaler

        //接口数据为utf-8编码所设置
        public class UTF8Marshaler : ICustomMarshaler
        {
            public void CleanUpManagedData(object managedObj)
            {
            }
    
            public void CleanUpNativeData(IntPtr pNativeData)
            {
                Marshal.FreeHGlobal(pNativeData);
            }
    
            public int GetNativeDataSize()
            {
                return -1;
            }
    
            public IntPtr MarshalManagedToNative(object managedObj)
            {
                if (object.ReferenceEquals(managedObj, null))
                    return IntPtr.Zero;
                if (!(managedObj is string))
                    throw new InvalidOperationException();
    
                byte[] utf8bytes = Encoding.UTF8.GetBytes(managedObj as string);
                IntPtr ptr = Marshal.AllocHGlobal(utf8bytes.Length   1);
                Marshal.Copy(utf8bytes, 0, ptr, utf8bytes.Length);
                Marshal.WriteByte(ptr, utf8bytes.Length, 0);
                return ptr;
            }
    
            public object MarshalNativeToManaged(IntPtr pNativeData)
            {
                if (pNativeData == IntPtr.Zero)
                    return null;
    
                List<byte> bytes = new List<byte>();
                for (int offset = 0; ; offset  )
                {
                    byte b = Marshal.ReadByte(pNativeData, offset);
                    if (b == 0)
                        break;
                    else 
                        bytes.Add(b);
                }
                return Encoding.UTF8.GetString(bytes.ToArray(), 0, bytes.Count);
            }
    
            private static UTF8Marshaler instance = new UTF8Marshaler();
            public static ICustomMarshaler GetInstance(string cookie)
            {
                return instance;
            }
        }
    

     

     

    四、更新接口字串封送样式

        [DllImport("VideoDownloader", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        private extern static bool VDDownload(IntPtr instance,
            [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]
            string savePath,
            [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]
            string imageSavePath,
            string quality, string ext, string subtitleLang);
    

    证实职业OK!运转效果如下:

    皇家赌场 2

    从那之后,三个手艺困难消除,记录于此。

    1. 起 源 : VCU拾之录像下载模块,选择纯python编码达成,c 代码调用pythonrun.h配置python运营条件运营python模...

    华语编码难题是用中文的程序猿日常头大的难题,在python下也是那样,那么相应怎么精晓和平消除决python的编码难题吧?

    VCU10之摄像下载模块,选择纯python编码达成,c 代码调用pythonrun.h配置python运维情状运行python模块,编写翻译为dll给c#调用,以使分界面UI能够利用在那之中效能。

    python内部选择的是unicode编码,而外部却要面前境遇千奇百怪的各个编码,比方作为中华人民共和国主次平时要直面包车型大巴gbk,gb231二,utf八等,那那个编码是怎么调换到内部的unicode呢?

    永不问为何不用IronPython,它不是正统Python,且下载模块亦要为Mac产品所用。

    率先大家先看一下源代码文件中动用字符串的景况。源代码文件作为文本文件就一定是以某种编码方式累积代码的,python私下认可会感觉源代码文件是asci编码,比方说代码中有三个变量赋值:

    万事伊始难难题!用去一天时间往往打字与印刷日志,验证所传字串差别,以期待发掘难题定位难题,直至下班前始有灵感。

    s1=’a’ 
    print s1

    表明开采,非中文字符能够符合规律下载,汉语字符下载剖析战败,当时即想到大概是字串不统一所致,就在python代码试遍字串编码调换,均不奏效。

    python感到那个’a'正是1个asci编码的字符。在仅仅使用英文字符的情景下壹切平常,不过假设用了华语,比方:

    原接口封装代码如下:

    s1=’哈’ 
    print s1

        [DllImport("VideoDownloader", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        private extern static bool VDDownload(IntPtr instance, string savePath, string imageSavePath,
            string quality, string ext, string subtitleLang);
    

    以此代码文件被实践时就能够出错,就是编码出了难题。python暗许将代码文件内容当作asci编码管理,但asci编码中不设有中文,由此抛出非常。

    比如传savePath为[d:vcu新],dll调用python模块,打字与印刷其编码音信:

    消除难点之道便是要让python知道文书中央银行使的是哪些编码格局,对于华语,能够用的常见编码有utf-8,gbk和gb231二等。只需在代码文件的最前端增加如下:

    print 'dir: '   dir   ', code: '   repr(dir))
    

    # -*皇家赌场,- coding: utf-8 -*-

    则打字与印刷日志为:

    那就是报告python小编这几个文件里的文本是用utf-八编码的,那样,python就能按部就班utf-八的编码情势解读当中的字符,然后调换到unicode编码内处利用。

    dir: d:kvd新, code: 'd:\kvdxd0xc2'
    

    唯独,假设您在Windows调整台下运营此代码的话,就算先后是进行了,但显示屏上打字与印刷出的却不是哈字。那是出于python编码与垄断台编码的不均等导致的。Windows下调控台南的编码使用的

    本文由68399皇家赌场发布于集群主机,转载请注明出处:c#调用dll接口传递utf-八字串方法,

    关键词: 68399皇家赌场 Python

上一篇:(转)Python模块之requests

下一篇:没有了