はてなキーワード: SJISとは
utf8の文字コードで構成されたバイナリーファイルがある。このファイルの改行の数を数えよ。改行はCRのみとする。このファイルにはCR が必ず含まれており、CRで分割すればマルチスレッドで処理できる。
size_t count_cr_in_file(const std::string& path) {
std::ifstream fs(path, std::ios::binary);
size_t size = fs.tellg();
fs.seekg(0);
const size_t thread_count = std::thread::hardware_concurrency();
const size_t chunk_size = size / thread_count;
std::vector<std::future<size_t>> futures;
for (size_t t = 0; t < thread_count; t++) {
size_t start = t * chunk_size;
size_t end = (t == thread_count - 1 ? size : (t + 1) * chunk_size);
futures.push_back(std::async(std::launch::async, [start, end, &path]() {
std::ifstream fs(path, std::ios::binary);
fs.seekg(start);
size_t count = 0;
for (size_t i = start; i < end; i++) {
char c;
if (c == '\r') count++;
}
return count;
}));
}
size_t total = 0;
for (auto& f : futures) total += f.get();
return total;
}
import mmap
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
return mm.count(b'\r')
c#で書けと指示したところ、
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
{
public static long CountCRInFile(string path)
{
using var mmf = MemoryMappedFile.CreateFromFile(path, FileMode.Open, null);
using var accessor = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);
long fileSize = accessor.Capacity;
int processorCount = Environment.ProcessorCount;
long chunkSize = fileSize / processorCount;
long total = 0;
object lockObj = new object();
Parallel.For(0, processorCount, i =>
{
long start = i * chunkSize;
long end = (i == processorCount - 1) ? fileSize : (i + 1) * chunkSize;
long localCount = 0;
byte b;
for (long pos = start; pos < end; pos++)
{
if (b == 0x0D) // CR
localCount++;
}
lock (lockObj)
{
total += localCount;
}
});
return total;
}
static void Main(string[] args)
{
long count = CountCRInFile(path);
Console.WriteLine($"CR count = {count}");
}
}
というコードが出てきた。
実際はcrlf,lfもあり得るんだが、そこは考慮しなくてもよく、そう考えるとaiはすごいとしか言いようがない。
https://anond.hatelabo.jp/20231030123322
こんな怪談パロがあったが
ぱっと検索した感じだとこんなのとか (https://www.youtube.com/watch?app=desktop&v=p_i5dJivlqg)
怖い文字化けって、大体UTF-8の文字をSJISで開いたときのパターンなんだよね
おかしいよね。
霊や人外が、人間やコンピュータが理解できないデータを送ったり、念により誤作動を起こさせるというのはフィクションとして理解はできる。
で、スマホ等は現在一般的にUTF-8で文字列を解釈するわけじゃん。
暗黙的にJSTとして時間を使ったせいでUTCで作った場所で盛大にバグる
応急処置でバグったところを+9とかやってしまうと、それ以降に逆に誰も気付かずに更に影響範囲が拡がったりする
海外展開しようとしたときにバグに気付くがどうしようもなくなって途方にくれて海外だけは別アプリになったりする
UNIXTIMEを使えば楽なんだけれど、そうすると生データぱっと見で時間を判別できないので困ることも多い
素直にUTCでISO8601が良い
とりあえずUTF-8にしとけば大丈夫、ってことで実装を進めた結果、Mac/Winでハマる
他にもBOMでハマったりして、むしろSJISの方が良かったんじゃ無いか、とか言い出す
DBが統一的になっている場合はまだ後からどうにかできるが、変なところでキャッシュされてたりすると凄い困ることになる
MySQLなりPostgreSQLなりでUTF-8を正しく扱う方法はいろんな記事があるのでちゃんと読んでおけば問題無い
とかよく分からないことを言い出して価格を浮動小数にしてしまう
確かに米国なら$2.43みたいな感じで価格を使ったりするし、むしろ小数点以下が無い通貨の方が珍しいのだけれど
丸め誤差を考えないで作ってしまってバグが見つかりめちゃくちゃ揉める
未だにSJIS使ってる……?
アニメがはじまったついでにPC98版 YU-NOのメッセージファイルフォーマットを解析してみた。
"*.MES"
+0 offset(2byte)
+2 辞書データ(offset - 2 byte) sjis2byte文字のつめあわせ
| 0x06 | 次の0x06までのデータがファイル名 |
| 0x11 | 入力待ち |
| 0xC0-0xCF,0x60-0x7F | 0x20を足して次の1byteを追加すればsjisの1文字になる |
| 0xD0-0xFF | 0xD0を引いて2倍した数値に該当する辞書データの1文字 |
| 0x133003 | 主人公の名前に置き換え |
他にもコマンドいろいろあるみたい
プロマネ「うーん、某社の社内システムをほぼ作り終えたはいいが、肝心のInternet Explorer 11でなんで文字化けするんや?」
通りすがりのワイ(別プロジェクト所属)「何か悩んでるんですか?」
プロマネ「かくかくしかじかなんだよ。文字コードUTF-8なんだけどさ?」
ワイ「あー、WindowsはSJISにしか対応していませんよ。もちろんIEも」
ワイ「クライアントにはゴメンナサイして、文字コード絡むところ修正しないとだめっすねえ。Unicodeの顔文字も受け付ける要件だったんですか?じゃあ要件定義からやり直しっすねえ」
最近ワイ「ん?Internet Explorerは特別にUTF-8に対応している?んん?」
これワイが悪いんか?
一方俺はSJISで保存しなおした