38006


エンコーディングオブジェクトを取得する際、GetEncodingメソッド対して、以下のように「cp932」を引数として指定すると例外が発生します。  
`Encoding.GetEncoding("cp932")`  
※これは、「cp932」がエンコーディング名として認識されないためであり、本来は「shift_jis」や「932」「x-ms-
cp932」等を指定すべきことは承知しております。

ここで、「cp932」を指定した場合でも、例外を発生させず、「shift_jis」等を指定した場合と同等のEncodingオブジェクトを取得する方法を模索しています。

「x-ms-
cp932」等、本来のエンコーディング名のエイリアスとして登録されているものがあるため、何らかの方法で新たなエイリアスを登録できないかと考えていますが、良い方法はありませんでしょうか？


CC BY-SA 3.0
2017-09-17T14:58:55.230
38005
2017-09-18T07:26:39.637
25439
question
.net
Encoding.GetEncoding(String)で指定可能なエンコーディング名のエイリアスを登録するには


`cp932`をサポートする`EncodingProvider`の継承クラスを作成し、`Encoding.RegisterProvider`で登録すればよいのでは。

[code]

    class CP932EncodingProvider : EncodingProvider
    {
        public override Encoding GetEncoding(string name)
        {
            if (name.Equals("cp932", StringComparison.OrdinalIgnoreCase))
            {
                return Encoding.GetEncoding(932);
            }
            return null;
        }
    
        public override Encoding GetEncoding(int codepage)
        {
            return null;
        }
    }
    
    static void Main()
    {
        Encoding.RegisterProvider(new CP932EncodingProvider());
    
        Console.WriteLine(Encoding.GetEncoding("cp932"));
    
        Console.ReadKey();
    }
    
[/code]


CC BY-SA 3.0
2017-09-17T16:11:56.720
38006
2017-09-17T16:18:26.603
2017-09-17T16:18:26.603
5750
5750
38005
answer


[`Encoding.GetEncoding()`のドキュメント](https://msdn.microsoft.com/en-
us/library/t9a3kf7c\(v=vs.110\).aspx)には

> The code page name of the preferred encoding. Any value returned by the
> WebName property is valid. Possible values are listed in the Name column of
> the table that appears in the Encoding class topic.

と説明されていて、[`Encoding`クラスのRmarks](https://msdn.microsoft.com/en-
us/library/system.text.encoding\(v=vs.110\).aspx#Anchor_5)にリストされている名前か`WebName`プロパティ値が有効とのことです。ですので`x-ms-
cp932`は非公式な動作となります。  
その上で、質問のエンコーディング登録方法としてはpgrhoさんが紹介されているように[`Encoding.RegisterProvider()`](https://msdn.microsoft.com/en-
us/library/system.text.encoding.registerprovider\(v=vs.110\).aspx)が提供されています。なお、この機能は.NET
4.6で導入されたものですので、4.5.2以前では使用できません。

* * *

参考までに`Encoding.GetEncoding()`で使用可能なエイリアスの非公式なリストを作成してみました。コードページ932に対しては`csShiftJIS`、`csWindows31J`、`ms_Kanji`、`shift-
jis`、`shift_jis`、`sjis`、`x-ms-cp932`、`x-sjis`が用意されていました。  
散発的に用意されているだけの印象がありますので、やはりこれらの値には依存しない方がいいと思います。

[code]

    37: cp037, csIBM037, ebcdic-cp-ca, ebcdic-cp-nl, ebcdic-cp-us, ebcdic-cp-wt, IBM037
    437: 437, cp437, csPC8CodePage437, IBM437
    500: CP500, csIBM500, ebcdic-cp-be, ebcdic-cp-ch, IBM500
    708: ASMO-708
    720: DOS-720
    737: ibm737
    775: ibm775
    850: cp850, IBM850
    852: cp852, IBM852
    855: cp855, IBM855
    857: cp857, IBM857
    858: CCSID00858, CP00858, cp858, IBM00858, PC-Multilingual-850+euro
    860: cp860, IBM860
    861: cp861, IBM861
    862: cp862, DOS-862, IBM862
    863: cp863, IBM863
    864: cp864, IBM864
    865: cp865, IBM865
    866: cp866, IBM866
    869: cp869, IBM869
    870: CP870, csIBM870, ebcdic-cp-roece, ebcdic-cp-yu, IBM870
    874: DOS-874, iso-8859-11, TIS-620, windows-874
    875: cp875
    932: csShiftJIS, csWindows31J, ms_Kanji, shift-jis, shift_jis, sjis, x-ms-cp932, x-sjis
    936: chinese, CN-GB, csGB2312, csGB231280, csISO58GB231280, GB2312, GB2312-80, GB231280, GBK, GB_2312-80, iso-ir-58
    949: csKSC56011987, iso-ir-149, korean, ks-c-5601, ks-c5601, KSC5601, KSC_5601, ks_c_5601, ks_c_5601-1987, ks_c_5601-1989, ks_c_5601_1987
    950: Big5, Big5-HKSCS, cn-big5, csbig5, x-x-big5
    1026: CP1026, csIBM1026, IBM1026
    1047: IBM01047
    1140: CCSID01140, CP01140, ebcdic-us-37+euro, IBM01140
    1141: CCSID01141, CP01141, ebcdic-de-273+euro, IBM01141
    1142: CCSID01142, CP01142, ebcdic-dk-277+euro, ebcdic-no-277+euro, IBM01142
    1143: CCSID01143, CP01143, ebcdic-fi-278+euro, ebcdic-se-278+euro, IBM01143
    1144: CCSID01144, CP01144, ebcdic-it-280+euro, IBM01144
    1145: CCSID01145, CP01145, ebcdic-es-284+euro, IBM01145
    1146: CCSID01146, CP01146, ebcdic-gb-285+euro, IBM01146
    1147: CCSID01147, CP01147, ebcdic-fr-297+euro, IBM01147
    1148: CCSID01148, CP01148, ebcdic-international-500+euro, IBM01148
    1149: CCSID01149, CP01149, ebcdic-is-871+euro, IBM01149
    1200: ISO-10646-UCS-2, ucs-2, unicode, utf-16, UTF-16LE
    1201: unicodeFFFE, UTF-16BE
    1250: windows-1250, x-cp1250
    1251: windows-1251, x-cp1251
    1252: windows-1252, x-ansi
    1253: windows-1253
    1254: Windows-1254
    1255: windows-1255
    1256: cp1256, windows-1256
    1257: windows-1257
    1258: windows-1258
    1361: Johab
    10000: macintosh
    10001: x-mac-japanese
    10002: x-mac-chinesetrad
    10003: x-mac-korean
    10004: x-mac-arabic
    10005: x-mac-hebrew
    10006: x-mac-greek
    10007: x-mac-cyrillic
    10008: x-mac-chinesesimp
    10010: x-mac-romanian
    10017: x-mac-ukrainian
    10021: x-mac-thai
    10029: x-mac-ce
    10079: x-mac-icelandic
    10081: x-mac-turkish
    10082: x-mac-croatian
    12000: utf-32, UTF-32LE
    12001: UTF-32BE
    20000: x-Chinese-CNS
    20001: x-cp20001
    20002: x-Chinese-Eten
    20003: x-cp20003
    20004: x-cp20004
    20005: x-cp20005
    20105: irv, x-IA5
    20106: DIN_66003, German, x-IA5-German
    20107: SEN_850200_B, Swedish, x-IA5-Swedish
    20108: Norwegian, NS_4551-1, x-IA5-Norwegian
    20127: ANSI_X3.4-1968, ANSI_X3.4-1986, ascii, cp367, csASCII, IBM367, iso-ir-6, ISO646-US, ISO_646.irv:1991, us, us-ascii
    20261: x-cp20261
    20269: x-cp20269
    20273: CP273, csIBM273, IBM273
    20277: csIBM277, EBCDIC-CP-DK, EBCDIC-CP-NO, IBM277
    20278: CP278, csIBM278, ebcdic-cp-fi, ebcdic-cp-se, IBM278
    20280: CP280, csIBM280, ebcdic-cp-it, IBM280
    20284: CP284, csIBM284, ebcdic-cp-es, IBM284
    20285: CP285, csIBM285, ebcdic-cp-gb, IBM285
    20290: cp290, csIBM290, EBCDIC-JP-kana, IBM290
    20297: cp297, csIBM297, ebcdic-cp-fr, IBM297
    20420: cp420, csIBM420, ebcdic-cp-ar1, IBM420
    20423: cp423, csIBM423, ebcdic-cp-gr, IBM423
    20424: cp424, csIBM424, ebcdic-cp-he, IBM424
    20833: X-EBCDIC-KoreanExtended
    20838: csIBMThai, IBM-Thai
    20866: csKOI8R, koi, koi8, koi8-r, koi8r
    20871: CP871, csIBM871, ebcdic-cp-is, IBM871
    20880: cp880, csIBM880, EBCDIC-Cyrillic, IBM880
    20905: CP905, csIBM905, ebcdic-cp-tr, IBM905
    20924: CCSID00924, CP00924, ebcdic-Latin9--euro, IBM00924
    20936: x-cp20936
    20949: x-cp20949
    21025: cp1025
    21866: koi8-ru, koi8-u
    28591: cp819, csISOLatin1, ibm819, iso-8859-1, iso-ir-100, iso8859-1, iso_8859-1, iso_8859-1:1987, l1, latin1
    28592: csISOLatin2, iso-8859-2, iso-ir-101, iso8859-2, iso_8859-2, iso_8859-2:1987, l2, latin2
    28593: csISOLatin3, iso-8859-3, iso-ir-109, ISO_8859-3, ISO_8859-3:1988, l3, latin3
    28594: csISOLatin4, iso-8859-4, iso-ir-110, ISO_8859-4, ISO_8859-4:1988, l4, latin4
    28595: csISOLatinCyrillic, cyrillic, iso-8859-5, iso-ir-144, ISO_8859-5, ISO_8859-5:1988
    28596: arabic, csISOLatinArabic, ECMA-114, iso-8859-6, iso-ir-127, ISO_8859-6, ISO_8859-6:1987
    28597: csISOLatinGreek, ECMA-118, ELOT_928, greek, greek8, iso-8859-7, iso-ir-126, ISO_8859-7, ISO_8859-7:1987
    28598: csISOLatinHebrew, hebrew, iso-8859-8, ISO-8859-8 Visual, iso-ir-138, ISO_8859-8, ISO_8859-8:1988, logical, visual
    28599: csISOLatin5, iso-8859-9, iso-ir-148, ISO_8859-9, ISO_8859-9:1989, l5, latin5
    28603: iso-8859-13
    28605: csISOLatin9, iso-8859-15, ISO_8859-15, l9, latin9
    29001: x-Europa
    38598: iso-8859-8-i
    50220: iso-2022-jp
    50221: csISO2022JP
    50225: csISO2022KR, iso-2022-kr, iso-2022-kr-7, iso-2022-kr-7bit
    50227: cp50227, x-cp50227
    51932: csEUCPkdFmtJapanese, euc-jp, Extended_UNIX_Code_Packed_Format_for_Japanese, iso-2022-jpeuc, x-euc, x-euc-jp
    51936: euc-cn, x-euc-cn
    51949: csEUCKR, euc-kr, iso-2022-kr-8, iso-2022-kr-8bit
    52936: hz-gb-2312
    54936: GB18030
    57002: x-iscii-de
    57003: x-iscii-be
    57004: x-iscii-ta
    57005: x-iscii-te
    57006: x-iscii-as
    57007: x-iscii-or
    57008: x-iscii-ka
    57009: x-iscii-ma
    57010: x-iscii-gu
    57011: x-iscii-pa
    65000: csUnicode11UTF7, unicode-1-1-utf-7, unicode-2-0-utf-7, utf-7, x-unicode-1-1-utf-7, x-unicode-2-0-utf-7
    65001: unicode-1-1-utf-8, unicode-2-0-utf-8, utf-8, x-unicode-1-1-utf-8, x-unicode-2-0-utf-8
    
[/code]

取得コード（C++/CLI）

[code]

    #include <cstdint>
    #include <iostream>
    #include <map>
    
    using namespace System;
    using namespace System::Reflection;
    
    struct InternalEncodingDataItem {
        const char* webName;
        std::uint16_t codePage;
    };
    
    template<BindingFlags flag, class T>
    inline auto invokeMember(Type^ type, String^ name, Object^ target = nullptr) {
        return reinterpret_cast<T^>(type->InvokeMember(name, flag | (target == nullptr ? BindingFlags::Static : BindingFlags::Instance) | BindingFlags::NonPublic, nullptr, target, nullptr));
    }
    
    int main() {
        auto encodingTable = Object::typeid->Assembly->GetType("System.Globalization.EncodingTable");
        auto encodingDataPtr = invokeMember<BindingFlags::GetField, Pointer>(encodingTable, "encodingDataPtr");
        auto encodingData = reinterpret_cast<InternalEncodingDataItem*>(invokeMember<BindingFlags::InvokeMethod, IntPtr>(Pointer::typeid, "GetPointerValue", encodingDataPtr)->ToPointer());
        auto lastEncodingItem = *invokeMember<BindingFlags::GetField, Int32>(encodingTable, "lastEncodingItem");
        std::multimap<std::uint16_t, const char*> encodings;
        for (auto i = 0; i <= lastEncodingItem; ++i)
            encodings.emplace(encodingData[i].codePage, encodingData[i].webName);
        for (auto it = begin(encodings); it != end(encodings);) {
            std::cout << it->first << ": " << it->second;
            auto range = encodings.equal_range(it->first);
            while (++it != range.second)
                std::cout << ", " << it->second;
            std::cout << std::endl;
        }
        return 0;
    }
    
[/code]

ちなみに.NET
Coreだと[この辺り](https://github.com/dotnet/coreclr/blob/52a816d3011f4d03b80b5940dc036b40d701f52d/src/classlibnative/nls/encodingdata.cpp#L15-L66)で`x-ms-
cp932`等は消されています。


CC BY-SA 3.0
2017-09-18T07:26:39.637
38012
2017-09-18T07:26:39.637
4236
38005
answer