Curl Global Community
Clipboard.get-string のバグ? - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: Clipboard.get-string のバグ? (/showthread.php?tid=912)



Clipboard.get-string のバグ? - umemura - 06-13-2013

エクセルからコピーされたデータをClipboard 経由で、グリッドに貼り付けを行う際、
ひとつのセルのなかで改行されている場合に、Curl側でその改行を削除し、ひとつのセルの中のデータとして整形したいと思ったのですが、
うまく判別する方法を考えられませんでした。

エクセルからコピーされたデータとしては、セル内の改行は、LF(ラインフィード)になっているので、
この文字を削除すればよいかと思ったのですが、
Clipboard.get-string で取得した後の文字は、LFは、CR(キャリッジリターン)に変換されているため、
判別する基準として利用できません。

セル内に改行がある場合はダブルコーテーションでくくられるので、
それを判断の基準にしようかと思ったのですが、エスケープ(2重に)されたダブルコーテーションがあった場合や、
改行直前にダウブルコーテーションがあった場合など、
判別が複雑になるため、今のところ、連続した二つのダブルコーテーションはすべて削除してしまう、
という方法に落ち着きました。

WindowsのようにCR とLF を混合しない、Mac や Linux に対応しているための問題なのかもしれませんが、
エクセルからのコピーは、現場では多用されるので、できれば対応してもらいたいです。



RE: Clipboard.get-string のバグ? - heavybugtracker - 06-20-2013


「エクセルからのコピーは、現場では多用されるので、できれば対応してもらいたいです。」
具体的に、どのような対応ですか?

ちなみに、Excelのセル内改行コードについて、このような情報もあるみたいです:

「Excelの改行コードが0Aだけなのは昔からの仕様で、なぜそうなっているのか本当の理由はわかりません。ExcelはもともとMacintosh用に開発されたアプリだから・・・という話も聞きますが、本当のところはわかりません。理由はともあれ、Excelの改行コードは0Aだけだということです。
では、セル内の改行コードはどんなときも0Aだけかというと、実は違います。手動操作でAlt+Enterキーを押してセル内改行をした場合には、改行コードとして0Aだけが入力されますが、マクロなどでユーザーが明示的に0D 0Aの改行コードを使用した場合は、そのまま0D 0Aが保存されます。実際にやってみましょう。次のマクロで、セルB2に0D 0Aで改行したデータを入力してみます。



http://officetanaka.net/excel/vba/tips/tips89.htm



RE: Clipboard.get-string のバグ? - umemura - 06-28-2013

説明不足ですいません。私の「対応」が指す内容は、
キャリッジリターンと、ラインフィードを分けて取得したい、という意味です。

現在、Curlでは、キャリッジリターン、ラインフィードのどちらも LF として取得されている、という認識です。

下記サンプルでは、"\r\n"=CR+LF も、"\n"=LF も、どちらも文字コードとしては「10」で表示されます
ASCIIに準じると、各改行コードの文字は、CR(復帰、0x0D=16)、LF(改行、0x0A=10)となり、
どちらも、int形式では 10 となることが、このように判断しました。
(NewlineSequence の指定が間違っていたらご指摘ください。)


Code:
{let input-ta:TextArea =
    {TextArea width=3in, height=1in, value="A\r\nB\nC"}}
{value input-ta}
{CommandButton
    label = "文字をintで表示する",
    {on Action do
        def input =
            {NewlineFilterTextInputStream
                {input-ta.value.to-InputStream},
                newline-sequence = NewlineSequence.all
            }
        {while not input.end-of-stream? do
            {popup-message {input.read-one} asa int}
        }
    }
}


ただ、heavybugtracker さんが引用してくださった内容を見る限り、
キャリッジリターン、ラインフィードとを個別に判別できたとしても、
エクセルのシートからコピーされたデータをそのままグリッドに貼り付けるには、
正確に"(ダブルクォーテーション)でくくられた情報を判断する処理が必要そうですね。