山口屋~活動日誌~

私生活で主な出来事をピックアップ

C# 1文字 読み込み ファイル 入力 サロゲート String 出力 文字化け

2023-11-21 12:44:17 | ソフトウェア開発
C言語のfgetcと同じように1文字ずつC#で読み込みたいときは、StreamReader.Readメソッドを使えばよく、戻り値がint型であることも同じである。ただし、改行コードも1文字ずつとなりCRLFが2文字となるため、処理に注意が必要である。

C#内部の文字コードはUTF-16だが、Windowsで扱うテキストファイルはShift-JISであったりUTF-8であったり(Windows10 May 2019 Update で、メモ帳の文字コード既定値がShift-JISからUTF-8に変わった)と、細かい処理をする際は注意が必要。Encoding.Defaultのコードページを調べてみると932(Shift-JIS)だったり、コマンドプロンプトの文字コードをchcpコマンドで調べてみると932(Shift-JIS)だったり、複雑だ。

C#内部の文字コードはUTF-16ということで、サロゲートの処理について気になったので、いろいろ調べてみた。

String型の内部はCharオブジェクトで構成され、各Charオブジェクトには各UTF-16の2Byteを格納している。
日経クロステック(xTECH):C#プログラムでサロゲート・ペアの動作を検証する(前編)

UTF-8では3Byte以上の文字もあるが、UTF-16で2Byteで表現できるものはCharオブジェクトからはみ出ることなく格納される。UTF-8やUTF-16では、Basic Multilingual Plane:基本多言語面を面00として表し、これ以外の面01-面10(16進数)をサロゲートとして表す。UTF-8では、面00は3Byteで表現可能で、面01-面10が4Byteとなる。

.NET Tips (VB.NET,C#...):文字列から1文字取得する、文字列内の文字を列挙する
.NET Tips (VB.NET,C#...):サロゲートペアや結合文字が含まれているか調べる

Char.IsSurrogateメソッドは引数がCharオブジェクトで、StreamReader.Readメソッドの戻り値のInt32オブジェクトとは異なる。StringBuilder.Appendメソッドは引数がInt32オブジェクトのものもあり、StreamReader.Readメソッドの戻り値のInt32オブジェクトがそのまま使えそう。よって、StreamReader.Readメソッドの戻り値をStringBuilder.Appendメソッドで連結した後、末尾のCharオブジェクトをChar.IsSurrogateメソッドで調べれば良い?

なお、サロゲートは、Windows のコマンドプロンプトが出力をサポートしておらず、そもそもコンソールバッファのひとマスが16bitしか確保してないらしい。
標準愚痴出力:Windows のコンソールと、Unicode のサロゲートペアとゼロ幅文字

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

C# 文字列 時刻 数値

2023-11-21 11:40:53 | ソフトウェア開発
本文作成のためただいま勉強中。

●アプリケーションを開始した実行ファイルのフォルダの取得
System.Windows.Forms.Application.StartupPath

●タブ区切りファイルを1行ずつ読み込み
StreamReader sr = new StreamReader(str, Encoding.GetEncoding("Shift_JIS"));
while (sr.EndOfStream == false)
{
string line = sr.ReadLine();
string[] fields = line.Split('\t');
}

●指定フォーマット文字列からDateTime構造体を取得
System.DateTime.ParseExact(str, "HH':'mm':'ss.f", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None);

<参考>

DOBON.NET:自分のアプリケーションの実行ファイルのパスを取得する
DOBON.NET:日時を表す文字列をDateTimeオブジェクトに変換する
DOBON.NET:日時(DateTimeオブジェクト)を文字列に変換する
DOBON.NET:日時、時間の計算をする
@IT:日時や時間間隔の加減算を行うには?
Yahoo!知恵袋:C#で折れ線グラフ描画に悩んでいます。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excel 行数 上限 FFT フーリエ変換

2023-11-17 21:18:56 | パソコン
Excel を使ってフーリエ変換 (FFT)をしましょうという話ではなく、Excel を使ってフーリエ変換結果を描かせるためのサンプル数の上限の話。

Excel 2021、2019、2016 はいずれも1048576行が上限とのことで、これはExcel 2007 以来長らく変わっていない。なお、Excelの分析ツールによるフーリエ解析では、4096点が上限とのことである。

<上限にあたるFFT処理の規模>

10進法:1048576=16進法:0x100000=2の20乗であるから、1048576を表現する整数で、ANSI C で確実に保証されるのは、unsigned int(UINT_MAXが2の16乗-1以上)ではなく、unsigned long(UINT_LONGが2の32乗-1以上)

倍精度浮動小数点数型(8byte)でプログラムに処理させる場合、FFTの処理には最低でも8byte×2(複素数)×1048576(サンプル)=16Mbyteの記憶領域が必要。

<上限にあたるFFT処理をする波形測定の規模>

1000000S(サンプル)ということになるので、100sの測定ならば10000S/s(100us/S)までの速度(10kHzにあたり、サンプリング定理から5kHzまでをカバー)が最大ということになる。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする