IronPython CRLF

Glade の覚書がちっとも進まない。
やっぱり普段使わないものの覚書って無理があるかも。
ということで Blog でやった IronPython ネタを地味にまとめている。

覚書のページ – L’Isola di Niente

つまりほとんどコピペ、でコードが IronPython 2.6 でキチンと動くか確認してみたんだが
IronPython の \n が CR/LF になるんだが…
以前は LF のみだったような気がするんだけど違ったかな。

追記

まてよ、もしかして System.IO と組み込み open では扱いが違うのかな?
というより IronPython では内部で \n はどう保持されているんだろう?
気になったのでテストコードを作って試してみた。

# -*- coding: UTF-8 -*-

import System

crlf_test = "a\nb"

# Inside is \n==LF
bytes = System.Text.Encoding.UTF8.GetBytes(crlf_test)
for i in range(len(bytes)):
    print bytes[i]

# The following code is \n==LF write
sr = System.IO.StreamWriter("test1.txt")
sr.Write(crlf_test)
sr.Close()

# The following code is \n==CR/LF write
f = open("test2.txt", "w")
f.write(crlf_test)
f.close()

やはり open() で書き込む時にのみ LF を CR/LF に変換しているようで。
標準 Python モジュールの関係あたりで CPython に無理やり合わせたのだろうと憶測。
以前は LF のみだったような気がしたのはコレに気が付かなかっただけかな。

ついでだから C# での内部も一応探ってみる。

using System;

class Program
{
	static void Main(string[] args)
	{
		System.Byte[] bytes = System.Text.Encoding.UTF8.GetBytes("a\nb");
		foreach(System.Byte b in bytes)
		{
			Console.WriteLine(b);
		}
	}
}

当然のように LF に、つまり .NET Framework なら内部では cli 仕様の \n==LF である。
注意しておかないとハマるかも。