ラズパイ+.net 5でIOTもどき

ついに、ラズパイに手を出してしまった・・・

ちょっと、マシンルームの温度計測やメールによるアラート機能を付けたくて、とりあえず、ラズパイ(3B+)と入門キットを購入。

電子回路なんて、高校の時にイジって以来だから、全然分からないけど、とりあえず、入門書とか読みながら、簡単な回路を作ってお試し中。

入門キットのサンプルは、CやPythonなんかで書かれているけど、やはり、ここはC#で書きたいよね。

で、ラズパイに.net 5を導入。ラズパイ3B+はARM64なんだけど、デフォルトで入っている、OSは32bit(メモリ1Gだからまぁ妥当だろう)のDebianベースのOSだが、デフォルトではapt listで調べるも、dotnet-sdkは見つからない。何かしらの方法はあるのだろうが、パッケージマネージャーからインストールするのは諦めて、.net 5ダウンロードサイトからのarm32版のtar.gzを落としてきて、展開。(どうせ、複数人数で使うわけじゃないから問題無し)

で、簡単な回路を作成してみる。

回路

とりあえず、赤枠で囲んだ部分が最初に作った回路。簡単に書くと以下のような回路になっている。

青いケーブルが+3.3Vに刺さっていて、赤いケーブルはラズパイ上のGPIO0に刺さっている。GPIO0の後の()に17と書かれているのはBCMと呼ばれる番号で、Microsoft製のライブラリはこちらの番号を指定する必要がある。以下はgpioコマンドの出力で、いくつかの名前やピン番号が表示されている。ライブラリによって、使用するピン番号が違うので、注意されたい。

ラズパイGPIO

なんで複数の呼び方があるのかとか言うのは、ラズパイ入門編のサイトとかに必ず書いてあるので、そちらを参照して欲しい。

で、今回この回路でやりたいのは、LEDの点灯・消灯である。回路を見ると、GPIO0(BCMピン番号17)が邪魔をする形になっているので、LEDを点灯させたければ、GPIO0(BCMピン番号17)の電位を落とす必要がある。逆に消灯させたい場合は電位を上げれば良い。

ということで、以下のようなコードでプログラムからLEDのオン・オフが実現できる。
(プロジェクトに↓のパッケージ追加が必要)

  • System.Device.Gpio
  • Iot.Device.Bindings

プログラムは単純にConsoleアプリで作ってみた。

using System;
using System.Threading;
// GPIOライブラリ
using System.Device.Gpio;

namespace oneLedCtrl
{
    class Program
    {
        static void Main(string[] args)
        {
            const int pinno = 17;   // BCM Pin No
            // GPIOコントローラインスタンス作成
            var ctrl = new GpioController();
            // Pinのオープン(書き込みモード)
            ctrl.OpenPin(pinno,PinMode.Output);
            PinValue val = PinValue.High;
            // 1秒ごとに点滅を繰り返す
            for(;!Console.KeyAvailable;) {
                if (val == PinValue.High) {
                    val = PinValue.Low; // 点灯
                } else {
                    val = PinValue.High; // 消灯
                }
                // GPIO0(BCM 17)に書き込み
                ctrl.Write(pinno,val);
                Thread.Sleep(1000);
            }
            ctrl.ClosePin(pinno);
        }
    }
}

これくらいの回路なら、簡単だからいいんだけど、複雑なのは配線も面倒だよね。
業務で使うのなら、やっぱり、回路が組んである製品を購入すべきなんだろうね。

まぁ、とりあえずは、入門キットで色々と遊んでみるつもり。

カテゴリー: C#, IOT, raspberry pi, 技術系 | 1件のコメント

知っている人には当たり前かもだけど・・・

asp.net core webappのページハンドラはデフォルトでは、GET要求はOnGet,POST要求はOnPostによって処理されるが、View側から実行するハンドラを変更することが可能。

方法は、TagHelperを使用して、Submit時にasp-page-handler属性を指定する。

例えば、以下のような感じで、Submitボタンによって呼ばれるハンドラを指定することが可能。

<form method="post">
	<button class="btn btn-secondary" asp-page-handler="cancel" type="submit">Cancel</button>  
	<button class="btn btn-primary" asp-page-handler="ok" type="submit">OK</button>
</form>

このような指定をすると、Cancelボタンクリック時には、OnPostCancelが呼び出され、OKボタンクリック時にはOnPostOkが呼び出される。ちなみに、ハンドラはOnの後ろに、asp-page-handlerで指定された名前の最初が大文字であれば、その後ろは大文字でも、小文字でも大丈夫なようだ。(OnPostOKでもOnPostOkでも大丈夫⇒静的言語なのに・・・)

なお、asp-page-handlerを指定した場合、URLに?handler=<ハンドラ名>が付加される。

URLを勝手に変更されたり、動的言語的な判断されるので、個人的には、好きな方法じゃないけど・・・

カテゴリー: asp.net core, dotnetcore, 技術系 | コメントする

DBからScaffold(RazorPage)

Visual Studio ASP.net MVCには、DBをScaffoldしてCRUDのページを自動作成する機能があったが、dotnet core(.NET)でも、同等の機能があったので、メモ。

dotnetのCLIでDBをScaffoldしてCRUDページを作成するには、aspnet-codegeneratorツールのインストールが必要。

下記で、ツールをインストールしておく。

dotnet tool install dotnet-aspnet-codegenerator -g

ちなみに、このツールを動かすためには、プロジェクトにMicrosoft.EntityFramework.SQLServerかMicrosoft.EntityFramework.Sqliteパッケージの追加が必要。(ツールがMemory上にテンポラリのDBを作成して使用するようだ)

ツールを動作させる前にDbContextが必要になるので、DBのScaffolding等で作成しておく。

次に、下記コマンドを実行する。(Razorページの場合の例。ツール実行にSQLServerではなく、Sqliteを使用する場合は -sqliteも必要)

dotnet aspnet-codegenerator razorpage -m <モデル(エンティティ)名> -dc <コンテキスト名> -outDir Pages/<出力先ディレクトリ> -scripts

指定したフォルダにCURDページが作成される。ちなみに、指定しない場合、ネームスペースはディレクトリ名と同様となる。

作成されたページを表示させるためには、Startup.csのConfigureServicesメソッドに、下記のようにDbContextを追加する。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<Dbコンテキスト名>();
    services.AddRazorPages();
}

実際にページを表示してみると、以下のような感じになる。

一覧
Create
Edit
Delete
Detail

ちなみに、文字列の最大長や入力レンジ,入力必須などのチェックはモデルに属性を付けておけば、自動的に行ってくれる。

暫定的なメンテナンス画面が欲しい時などには使えるかな。

カテゴリー: asp.net core, dotnetcore, Entity Framework, 技術系 | コメントする

BlazorのForm入力値検証について

Blazorで、Formの入力値を検証する方法を調べてみた。Blazorでは基本的にFormをSubmitしないので、すっかり頭から抜けていたけど・・・

Submitと言っても、実際にSubmitを行う訳では無いようだが、入力値のチェックは行う事が可能。

まず、入力値を保存するために以下のようなクラスを定義する必要がある。

// ラジオボタン用のEnum
public enum Countries { Japan, USA, China, UK }
// 入力値の保存用クラス
public class FormItems {
    [Required(ErrorMessage = "氏名は必須入力です")]
    [StringLength(10,ErrorMessage = "氏名は10文字以内です")]
    public string Name { get; set; }
    [Required(ErrorMessage = "希望国は必須選択項目です。")]
    public Countries? Country { get; set; } = null;
    [Range(typeof(bool),"true","true",
        ErrorMessage = "同意が必要です。")]
    public bool IsOK { get; set; }
}

メンバーに属性を付けることにより、入力値の検証を行う事ができる。
例えば、[Require]属性を付けると、入力値が無い場合は検証エラーとなる。文字列などは[StringLength]属性を使用して、最大長などを指定できる。

フォーム入力用にOnInitialize等で、上記クラスのインスタンスを作成しておき、以下のようにEditFormのModelとしてインスタンスを指定し、各入力タグのBind先として、メンバーを指定する。(この例では、OnValidSubmit属性にDoSubmitメソッドを指定して、全検証OKの場合、DoSubmitメソッドが呼び出されるようにしている)

<!-- InputValuesはFormItemsのインスタンス-->
<EditForm Model="@InputValues" OnValidSubmit="DoSubmit">
    <DataAnnotationsValidator/>
    <table>
    <tr>
        <td>氏名:</td><td><InputText @bind-Value="InputValues.Name"/></td><td><ValidationMessage For="@(()=>InputValues.Name)" class="validation-message"/></td>
    </tr>
    <tr>
        <td colspan="2">希望国:</td><td><ValidationMessage For="@(()=>InputValues.Country)" class="validation-message"/></td>
    </tr>
    <InputRadioGroup @bind-Value="InputValues.Country">
        @foreach(var itm in Enum.GetValues(typeof(Countries))) {
            <tr>
                <td colspan="3"><InputRadio Value="itm"/>@itm</td>
            </tr>
        }
    </InputRadioGroup>
    <tr>
        <td colspan="2"><InputCheckbox @bind-Value="InputValues.IsOK"/>添付の条項に同意します。</td><td><ValidationMessage For="@(()=>InputValues.IsOK)" class="validation-message"/></td>
    </tr>
    </table>
    <br/>
    <button class="btn btn-primary" type="submit">送信</button>
</EditForm>

検証時のエラーはValidationMessageタグでそれぞれの項目に関連づけて表示させているが、ValidationSummaryタグで一括で表示させることも可能。InputRadioGroupタグはBlazor5.0から使用可能なタグで、チェックされたラジオボタンの値がBindしたメンバーに設定される。

実行例

といった感じで、Form入力値の検証が可能。他にも、数値や日付の範囲指定等がメンバー属性だけで検証可能。また、カスタム検証ロジックの適用も可能。

カテゴリー: .NET, asp.net core, Blazor, 技術系 | コメントする

EF Core(SQL Server)のLINQクエリにContainsを使ってみた結果

EF CoreでSQLのINに相当する検索を行いたかったので、以下のようなLINQクエリを発行してみた。

// 検索対象の部署コード
string[] codes = new string[] { "XXX", "YYY", "ZZZ" };
// LINQクエリ(v.dcodeがcodesの中に含まれる)
var q = ctx.xxxTable.Where(v=>codes.Contains(v.dcode));

EFCoreのロギングレベルをInformationにして、生成されたSQLを確認したところ、

SELECT ・・・
	FROM [xxxTable] AS [x]
	WHERE ([x].[dcode] IN (N'XXX', N'YYY', N'ZZZ'))

と、見事にINを使用したSQLに変換されていた。

結構すごいと思わない?ちなみに、SQLiteでも同じようなクエリが発行されていた。

MS謹製以外のEFドライバはどうなんだろうか・・・

カテゴリー: .NET, dotnetcore, Entity Framework, 技術系 | 1件のコメント

blazorからgeolocation APIを使ってみる

HTML5をサポートしているブラウザでは、GPS等を使用して、位置情報を得る、geolocation APIを使用することが可能である。

geolocation APIには以下のような関数が用意されている。

geolocation.getCurrentPosition-位置情報を1回だけ取得する。

//
//	loc:位置情報
//	err:エラー情報
//
navigator.geolocation.getCurrentPosition(
    function(loc) {}	// 位置情報取得成功時処理
    function(err) {}	// 位置情報取得失敗時処理
);

geolocation.geolocation.watchPosition-位置情報が変わるたびに指定関数を呼び出す。

//
//	loc:位置情報
//	err:エラー情報
//
watchid = navigator.geolocation.watchPosition(
    function(e) {},		// 位置情報取得成功時処理
    function(e) {}		// 位置情報取得失敗時処理
);

geolocation.clearWatch-watchPositionの停止

//
//	watchid:watchPositionの戻り値
//
navigator.geolocation.clearWatch(watchid);
位置情報パラメータ
coords 位置情報
latitude緯度
longitude経度
altitude高度
accuracy緯度・経度の誤差
altitudeAccuracy高度の誤差
heading方角(0.0~360.0)
speedスピード
timestampタイムスタンプ

エラー情報パラメータ
codeエラーコード
0 不明なエラー
1 位置情報の取得を拒否された
2 位置情報を取得できない
3 タイムアウト
messageエラーメッセージ

折角このようなAPIがあるので、blazorから呼び出してみたい。ただ、getCurrentPosition関数やwatchPosition関数のコールバック関数が必要になるので、そこから、C#コードを呼び出すようにする。

var GPSLib = {
	・・・
	GetPosition : function(helper,complete,errorhandler) {
	    navigator.geolocation.getCurrentPosition(
	        function(e) {
	            // パラメータを作成(eをそのまま渡してもキャストされないので・・・)
	            var prm = {
	                coords: {
	                    latitude: e.coords.latitude,
	                    longitude: e.coords.longitude,
	                    altitude: e.coords.altitude != null ? e.coords.altitude : 0,
	                    accuracy: e.coords.accuracy != null ? e.coords.accuracy : 0,
	                    altitudeAccuracy: e.coords.altitudeAccuracy != null ? e.coords.altitude : 0,
	                    heading: e.coords.heading != null ? e.coords.heading : 0,
	                    speed: e.coords.speed != null ? e.coords.speed : 0
	                },
	                timestamp: e.timestamp
	            };
	            // C#コードの呼出し
	            helper.invokeMethodAsync(complete,prm);
	        },
	        function(e) {
	            // パラメータを作成(eをそのまま渡してもキャストされないので・・・)
	            var prm = {
					code: e.code,
					message: e.message
				};
	            // C#コードの呼出し
				helper.invokeMethodAsync(errorhandler,prm);
	        }
	    )
	},
・・・
};
// 位置情報(一応、すべてのプロパティを得られるようにした)
public class GeoInfo {
    public Coords coords { get; set; }
    public long timestamp { get; set; }
}
public class Coords {
    public double latitude {get; set;}	// 緯度
    public double longitude {get; set;}	// 経度
    public double altitude { get; set; }	// 高度
    public double accuracy	{get; set;} // 緯度・経度の誤差
    public double altitudeAccuracy {get; set;}	// 高度の誤差
    public double heading {get; set; }	// 方角(0.0~360.0)
    public double speed  { get; set; } // スピード
}
// エラー情報
public class GeoError {
	public int code { get; set; }
	public string message { get; set; }
}

// 位置情報取得完了時処理
[JSInvokable]
public async Task OnGetPositionComplete(GeoInfo e) {
    Latitude = e.coords.latitude;
    Longitude = e.coords.longitude;
    Orient = e.coords.heading;
	・・・
    this.StateHasChanged();
}

// 位置情報取得エラー時処理
[JSInvokable]
public void OnGetPositionFail(GeoError e) {
	ErrorMessage = $"位置情報取得エラー:{e.code} - {e.message}";
	this.StateHasChanged();
}

・・・
	// GetPositionの呼出し
	await JSRuntime.InvokeVoidAsync(
	    "GPSLib.GetPosition",
	    DotNetObjectReference.Create(this),
	    "OnGetPositionComplete","OnGetPositionFail");
	);

GoogleやBing等のMAP APIと組み合わせると、スマホやタブレット用に結構面白いアプリが簡単に作成できる。(歩いた場所のトレースや現在位置からスポット検索等)

イベントの発生頻度を考えると、Server Side版よりもWASM版で作成した方が良いと思われる。(保持できるデータの上限が気になるところだが・・・)

カテゴリー: asp.net core, Blazor, C#, 技術系 | コメントする

EntityFramework上でのSqlite DateTimeの扱い

SQLiteでは、日付型というものは基本的に存在しない。

SQLのCREATE TABLE中で型としてDATETIMEを指定しても、内部的にはBinaryとなってしまい、Scaffoldした場合はbyte[]として変換されてしまう。

Entity Frameworkで、コードファーストを使用して、DateTime型のプロパティをマイグレーションすると、SQLite上にはTEXT型として作成され、自動的に相互変換をかけるように設定してくれる。

ただ、データファーストで、Scaffoldをかけた場合、TEXT型のカラムから作成されるエンティティ中のプロパティはstring型になってしまう。

TEXT型だが、内容はDateTimとして扱いたい場合は、DbContextから派生させたクラス中で、OnModelCreatingメソッドをオーバーライドして、データ変換をかけることで解決できる。

例えば、前述の日時を格納するTEXT型のカラムをDateTimeとして扱いたければ、以下のようなコードを書いておけば良い。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyTable>(entity =>
    {
        entity.ToTable("MyTable");

        entity.Property(e => e.PostedTime)
            .HasColumnType("TEXT")
            .HasColumnName("PostedTime")
            .HasConversion<DateTime>();
    });

    OnModelCreatingPartial(modelBuilder);
}

これにより、MyTableテーブルのPostedTimeはDB上にはTEXT型として保存され、読み出し時にはDateTimeに変換されるようになる。

SQLiteの場合、MigrationとScaffoldで結果が違うので、どうすればいいかなと調べてみた。(ちなみに、Migration時に自動的に変換定義している模様。Migrationフォルダに自動生成されているようだ。)

カテゴリー: C#, dotnetcore, Entity Framework, 技術系 | 1件のコメント

asp.net core webappでのファイルダウンロード

以前にファイルアップロードの件でも少し書いたが、asp.net core webappでのファイルダウンロードについて、多分正解というのが分かったので・・・

結局、OnPostやOnGetをvoidで定義するのではなく、下記のようにActionResultを返すメソッドとして定義する。

public IActionResult OnPost(・・・) {
}

処理中でファイルをダウンロードさせたい場合は、File(・・・)を使用して、FileResultを返せば良い。また、ファイルダウンロードでは無く、画面表示をさせたい場合は、Page()を使用して、PageResultを返す。

// Excelファイルのダウンロード
try {
	using(xls = new ExcelPackage(new FileInfo(templatepath))) {
	    // セルに対して値の設定等の処理
    ・・・
		// ちなみに、ファイル名は自動的にurlencode化されるので、
		// 事前にUrlEncodeすると変なファイル名になる。
		// PageModel.Fileを使用して、FileResultを返す
	    return File(xls.GetAsByteArray(),"application/octet-stream",filename);
	}
} catch (Exception e) {
	Message = $"エラー発生{e.Message}";
	return Page();
}

なお、File(stream,・・・)を使用する場合、Streamに書き込み等を行っていた場合、ポジションを先頭に戻さないと、実行時エラーが起きるようだ。

Stream stm = MemoryStream();
// メモリストリームに書き込み
・・・
// ポジションを先頭に
stm.Seek(0L,SeekOrigin.Begin);
return File(stm,"application/octet-stream",filename);

やっぱり、基礎を覚えないとだめだね・・・

カテゴリー: .NET, asp.net core, C#, dotnetcore, 技術系 | 1件のコメント

asp.net webappモデルからのJS起動など

asp.net webappのモデル側からJS(例えばwindowをクローズ等)を起動できないものかと、以下のようなコードをチョット試してみた・・・

@page
@model TestModel
・・・
<script type="text/javascript">
@Html.Raw(Model.ExecScript)
</script>
public class TestModel : PageModel {
  ・・・
  public string ExecScript;
  public void OnPost(・・・) {
    ・・・
    ExecScript = @"window.close();";
    ・・・
}

結論としてはうまく動作。ただ、セキュリティ上Html.Rawはあまり使うべきではないのかな?

ちなみに、gijgoのTreeViewのdataSource指定なんかにもHtml.Rawを使って動的にTreeの内容を変更することも出来たけど、他にいいやり方あるかな?

<script type="text/javascript">
    $(document).ready(function() {
        $('#tree').tree({
            uiLibrary: 'bootstrap4',
            dataSource: @Html.Raw(Model.TreeItems), /* データソース(JSON)はモデルで作成 */
            primaryKey: 'id',
            imageUrlField: 'flagUrl'
        });
    });
カテゴリー: .NET, asp.net core, C#, 技術系 | 1件のコメント

.net core,.net 5でのShift_JISエンコーディング

最近、SJISのテキストファイルを.net 5でいじる必要があって、忘れていたことがあったので、メモ。

.net coreや.net 5では、デフォルトのエンコーディングセットとして、Shift_JISはサポートされていない。

CodePage=1200, Name=utf-16 ,DisplayName=Unicode
CodePage=1201, Name=utf-16BE ,DisplayName=Unicode (Big-Endian)
CodePage=12000, Name=utf-32 ,DisplayName=Unicode (UTF-32)
CodePage=12001, Name=utf-32BE ,DisplayName=Unicode (UTF-32 Big-Endian)
CodePage=20127, Name=us-ascii ,DisplayName=US-ASCII
CodePage=28591, Name=iso-8859-1 ,DisplayName=Western European (ISO)
CodePage=65001, Name=utf-8 ,DisplayName=Unicode (UTF-8)

Shift_JISやEUCなどを使用したい場合は、System.Text.Encoding.CodePagesパッケージが必要となる。

> dotnet add <プロジェクトフォルダ> package System.Text.Encoding.CodePages

これをプロジェクトに追加するだけではダメで、Encododingを取得する以前にプログラム中で下記処理を実行することが必要となる。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

これで、GetEncoding(“Shift_JIS”)でShift_JISエンコーディングを取得することが可能となる。ちなみに、エンコーディングリストを見てみたのだが、ISO-2022-JPが無いようにみえるのだが・・・まぁ、メール以外には使わないけど。

CodePage=37, Name=IBM037 ,DisplayName=IBM037
CodePage=437, Name=IBM437 ,DisplayName=IBM437
CodePage=500, Name=IBM500 ,DisplayName=IBM500
CodePage=708, Name=ASMO-708 ,DisplayName=ASMO-708
CodePage=720, Name=DOS-720 ,DisplayName=DOS-720
CodePage=737, Name=ibm737 ,DisplayName=ibm737
CodePage=775, Name=ibm775 ,DisplayName=ibm775
CodePage=850, Name=ibm850 ,DisplayName=ibm850
CodePage=852, Name=ibm852 ,DisplayName=ibm852
CodePage=855, Name=IBM855 ,DisplayName=IBM855
CodePage=857, Name=ibm857 ,DisplayName=ibm857
CodePage=858, Name=IBM00858 ,DisplayName=IBM00858
CodePage=860, Name=IBM860 ,DisplayName=IBM860
CodePage=861, Name=ibm861 ,DisplayName=ibm861
CodePage=862, Name=DOS-862 ,DisplayName=DOS-862
CodePage=863, Name=IBM863 ,DisplayName=IBM863
CodePage=864, Name=IBM864 ,DisplayName=IBM864
CodePage=865, Name=IBM865 ,DisplayName=IBM865
CodePage=866, Name=cp866 ,DisplayName=cp866
CodePage=869, Name=ibm869 ,DisplayName=ibm869
CodePage=870, Name=IBM870 ,DisplayName=IBM870
CodePage=874, Name=windows-874 ,DisplayName=windows-874
CodePage=875, Name=cp875 ,DisplayName=cp875
CodePage=932, Name=shift_jis ,DisplayName=shift_jis
CodePage=936, Name=gb2312 ,DisplayName=gb2312
CodePage=949, Name=ks_c_5601-1987 ,DisplayName=ks_c_5601-1987
CodePage=950, Name=big5 ,DisplayName=big5
CodePage=1026, Name=IBM1026 ,DisplayName=IBM1026
CodePage=1047, Name=IBM01047 ,DisplayName=IBM01047
CodePage=1140, Name=IBM01140 ,DisplayName=IBM01140
CodePage=1141, Name=IBM01141 ,DisplayName=IBM01141
CodePage=1142, Name=IBM01142 ,DisplayName=IBM01142
CodePage=1143, Name=IBM01143 ,DisplayName=IBM01143
CodePage=1144, Name=IBM01144 ,DisplayName=IBM01144
CodePage=1145, Name=IBM01145 ,DisplayName=IBM01145
CodePage=1146, Name=IBM01146 ,DisplayName=IBM01146
CodePage=1147, Name=IBM01147 ,DisplayName=IBM01147
CodePage=1148, Name=IBM01148 ,DisplayName=IBM01148
CodePage=1149, Name=IBM01149 ,DisplayName=IBM01149
CodePage=1200, Name=utf-16 ,DisplayName=Unicode
CodePage=1201, Name=utf-16BE ,DisplayName=Unicode (Big-Endian)
CodePage=1250, Name=windows-1250 ,DisplayName=windows-1250
CodePage=1251, Name=windows-1251 ,DisplayName=windows-1251
CodePage=1252, Name=windows-1252 ,DisplayName=windows-1252
CodePage=1253, Name=windows-1253 ,DisplayName=windows-1253
CodePage=1254, Name=windows-1254 ,DisplayName=windows-1254
CodePage=1255, Name=windows-1255 ,DisplayName=windows-1255
CodePage=1256, Name=windows-1256 ,DisplayName=windows-1256
CodePage=1257, Name=windows-1257 ,DisplayName=windows-1257
CodePage=1258, Name=windows-1258 ,DisplayName=windows-1258
CodePage=1361, Name=Johab ,DisplayName=Johab
CodePage=10000, Name=macintosh ,DisplayName=macintosh
CodePage=10001, Name=x-mac-japanese ,DisplayName=x-mac-japanese
CodePage=10002, Name=x-mac-chinesetrad ,DisplayName=x-mac-chinesetrad
CodePage=10004, Name=x-mac-arabic ,DisplayName=x-mac-arabic
CodePage=10005, Name=x-mac-hebrew ,DisplayName=x-mac-hebrew
CodePage=10006, Name=x-mac-greek ,DisplayName=x-mac-greek
CodePage=10007, Name=x-mac-cyrillic ,DisplayName=x-mac-cyrillic
CodePage=10010, Name=x-mac-romanian ,DisplayName=x-mac-romanian
CodePage=10017, Name=x-mac-ukrainian ,DisplayName=x-mac-ukrainian
CodePage=10021, Name=x-mac-thai ,DisplayName=x-mac-thai
CodePage=10029, Name=x-mac-ce ,DisplayName=x-mac-ce
CodePage=10079, Name=x-mac-icelandic ,DisplayName=x-mac-icelandic
CodePage=10081, Name=x-mac-turkish ,DisplayName=x-mac-turkish
CodePage=10082, Name=x-mac-croatian ,DisplayName=x-mac-croatian
CodePage=12000, Name=utf-32 ,DisplayName=Unicode (UTF-32)
CodePage=12001, Name=utf-32BE ,DisplayName=Unicode (UTF-32 Big-Endian)
CodePage=20000, Name=x-Chinese-CNS ,DisplayName=x-Chinese-CNS
CodePage=20001, Name=x-cp20001 ,DisplayName=x-cp20001
CodePage=20002, Name=x-Chinese-Eten ,DisplayName=x-Chinese-Eten
CodePage=20003, Name=x-cp20003 ,DisplayName=x-cp20003
CodePage=20004, Name=x-cp20004 ,DisplayName=x-cp20004
CodePage=20005, Name=x-cp20005 ,DisplayName=x-cp20005
CodePage=20105, Name=x-IA5 ,DisplayName=x-IA5
CodePage=20106, Name=x-IA5-German ,DisplayName=x-IA5-German
CodePage=20107, Name=x-IA5-Swedish ,DisplayName=x-IA5-Swedish
CodePage=20108, Name=x-IA5-Norwegian ,DisplayName=x-IA5-Norwegian
CodePage=20127, Name=us-ascii ,DisplayName=US-ASCII
CodePage=20261, Name=x-cp20261 ,DisplayName=x-cp20261
CodePage=20269, Name=x-cp20269 ,DisplayName=x-cp20269
CodePage=20273, Name=IBM273 ,DisplayName=IBM273
CodePage=20277, Name=IBM277 ,DisplayName=IBM277
CodePage=20278, Name=IBM278 ,DisplayName=IBM278
CodePage=20280, Name=IBM280 ,DisplayName=IBM280
CodePage=20284, Name=IBM284 ,DisplayName=IBM284
CodePage=20285, Name=IBM285 ,DisplayName=IBM285
CodePage=20290, Name=IBM290 ,DisplayName=IBM290
CodePage=20297, Name=IBM297 ,DisplayName=IBM297
CodePage=20420, Name=IBM420 ,DisplayName=IBM420
CodePage=20423, Name=IBM423 ,DisplayName=IBM423
CodePage=20424, Name=IBM424 ,DisplayName=IBM424
CodePage=20833, Name=x-ebcdic-koreanextended ,DisplayName=x-ebcdic-koreanextended
CodePage=20838, Name=IBM-Thai ,DisplayName=IBM-Thai
CodePage=20866, Name=koi8-r ,DisplayName=koi8-r
CodePage=20871, Name=IBM871 ,DisplayName=IBM871
CodePage=20880, Name=IBM880 ,DisplayName=IBM880
CodePage=20905, Name=IBM905 ,DisplayName=IBM905
CodePage=20924, Name=IBM00924 ,DisplayName=IBM00924
CodePage=20932, Name=EUC-JP ,DisplayName=EUC-JP
CodePage=20936, Name=x-cp20936 ,DisplayName=x-cp20936
CodePage=20949, Name=x-cp20949 ,DisplayName=x-cp20949
CodePage=21025, Name=cp1025 ,DisplayName=cp1025
CodePage=21866, Name=koi8-u ,DisplayName=koi8-u
CodePage=28591, Name=iso-8859-1 ,DisplayName=Western European (ISO)
CodePage=28592, Name=iso-8859-2 ,DisplayName=iso-8859-2
CodePage=28593, Name=iso-8859-3 ,DisplayName=iso-8859-3
CodePage=28594, Name=iso-8859-4 ,DisplayName=iso-8859-4
CodePage=28595, Name=iso-8859-5 ,DisplayName=iso-8859-5
CodePage=28596, Name=iso-8859-6 ,DisplayName=iso-8859-6
CodePage=28597, Name=iso-8859-7 ,DisplayName=iso-8859-7
CodePage=28598, Name=iso-8859-8 ,DisplayName=iso-8859-8
CodePage=28599, Name=iso-8859-9 ,DisplayName=iso-8859-9
CodePage=28603, Name=iso-8859-13 ,DisplayName=iso-8859-13
CodePage=28605, Name=iso-8859-15 ,DisplayName=iso-8859-15
CodePage=29001, Name=x-Europa ,DisplayName=x-Europa
CodePage=65001, Name=utf-8 ,DisplayName=Unicode (UTF-8)
カテゴリー: .NET, dotnetcore, 技術系 | 1件のコメント