XPagesで文字化け? toJson() を使ったらうまくいった話
XPagesでサーバーサイドの文字列をクライアントサイドJavaScriptへ渡す際、
文字列の内容によってはJavaScriptが正しく動作しなくなることがあります。
特に、以下のような文字が含まれている場合は注意が必要です。
- ダブルクォート
" - シングルクォート
' - バックスラッシュ
\ - 改行
- タブ
- 日本語などのUnicode文字
今回、XPagesで文字列をJavaScriptへ渡す処理を見直したところ、
toJson() を使用することで安全に受け渡せることが分かりました。
もともとの処理
例えば、SSJS側に以下のような関数があるとします。
function getSampleText() {
return "商品名:テスト商品";
}
この値をクライアントサイドJavaScriptへ渡したい場合、
単純に以下のように記述したくなります。
#{javascript:getSampleText()}
文字列が単純な内容であれば、問題なく動作する場合もあります。
しかし、実際のデータでは文字列内に改行やダブルクォートなどが含まれることがあります。
例えば以下のような文字列です。
商品名:テスト商品
備考:"特価品"
この文字列をそのままJavaScriptへ埋め込もうとすると、
生成されるJavaScriptが正しい構文にならない可能性があります。
なぜ問題が発生するのか
JavaScriptで文字列を扱う場合、文字列は通常以下のように記述します。
var text = "テスト";
しかし、文字列自体にダブルクォートが含まれていると、
例えば以下のような状態になる可能性があります。
var text = "備考:"特価品"";
これでは、JavaScriptがどこまでを文字列として扱えばよいのか判断できません。
そのため、JavaScriptエラーの原因になります。
また、改行やバックスラッシュなども、
そのままJavaScriptソースへ埋め込むと問題になる場合があります。
つまり、
サーバー側では正常な文字列でも、JavaScriptのソースコードとして直接埋め込むと壊れることがある
ということです。
toJson() を使う
そこで使用できるのがXPagesの toJson() です。
今回の記述は以下です。
#{javascript:toJson(getSampleText())};
getSampleText() が返した文字列を、
toJson() に渡しています。
例えば元の文字列が、
商品名:テスト商品
備考:"特価品"
だった場合、JavaScriptへ渡す際には概念的に以下のような形式になります。
"商品名:テスト商品\n備考:\"特価品\""
ダブルクォートは \"、
改行は \n のように、
JavaScriptやJSONで安全に扱える形式へエスケープされます。
その結果、ブラウザ側では例えば以下のような正常なJavaScriptとして扱うことができます。
var sampleText = "商品名:テスト商品\n備考:\"特価品\"";
JavaScriptが実際に値を取得すると、中身は元通りです。
商品名:テスト商品
備考:"特価品"
処理の流れ
getSampleText()
↓
サーバー側では正常な文字列
商品名:テスト商品
備考:"特価品"
↓
toJson()
"商品名:テスト商品\n備考:\"特価品\""
↓
ブラウザへ出力
↓
JavaScriptが安全に解釈
↓
元の文字列として利用できる
つまり toJson() は、簡単に言うと、
「この文字列をJavaScriptに渡してもぶっ壊れない形にするマン」
と考えると分かりやすいです。
toJson() は文字化けを直す処理ではない
ここは注意が必要です。
toJson() を使用した結果、日本語の表示が正常になり、
「toJson() で文字化けが直った」
ように見える場合があります。
しかし、厳密には toJson() は文字コード変換を行うための関数ではありません。
例えば getSampleText() の時点で、すでに以下のように文字化けしている場合、
繧ケ繝医Μ繝ウ繧ー
以下のようにしても、元の日本語へ復元されるわけではありません。
toJson(getSampleText())
UTF-8やShift_JISなど、文字コードの不一致が原因の場合は、
ファイル読み込み処理やHTTPレスポンスなど、別の箇所を確認する必要があります。
今回うまくいった理由
今回の場合、
getSampleText() で取得した段階では日本語は正常でした。
問題は、その文字列をXPagesからブラウザ側のJavaScriptへ渡す部分にありました。
そこで、
#{javascript:toJson(getSampleText())};
と変更したことで、以下のような処理が行われます。
- JavaScript用の文字列として扱える形になる
- ダブルクォートがエスケープされる
- 改行が
\nのような形に変換される - バックスラッシュなども適切に処理される
- JavaScript側で安全に文字列として解釈できる
その結果、見た目としては
「文字化けが直った」
ように見えた、ということになります。
例えばこんな文字列でも安全になる
例えば以下のようなデータがあるとします。
担当者:"田中"
保存先:C:\work\test
備考:
1行目
2行目
このような文字列をそのままJavaScriptへ渡すのは少し危険です。
toJson() を通すと、概念的には以下のようになります。
"担当者:\"田中\"\n保存先:C:\\work\\test\n備考:\n1行目\n2行目"
これならJavaScriptの文字列として安全に扱うことができます。
まとめ
XPagesのサーバーサイド処理で取得した文字列を、
クライアントサイドJavaScriptへ渡す場合は、
#{javascript:toJson(getSampleText())}
のように toJson() を使用すると安全です。
特に、外部ファイルやDBなどから取得した文字列には、
日本語、改行、ダブルクォート、バックスラッシュなどが含まれることがあります。
そのままJavaScriptへ埋め込むよりも、
toJson() を通したほうが安全に扱えます。
ただし、toJson() は文字化けを修復する関数ではありません。
役割としては、
サーバー側の文字列を、JavaScript側で安全に解釈できるJSON形式の文字列へ変換する
という理解が分かりやすいと思います。
XPagesで
「サーバー側では正常なのにJavaScriptへ渡すとうまく表示されない」
「クォートや改行が入るとJavaScriptエラーになる」
といった場合には、toJson() を試してみる価値があります。
2026年08月18日
こんにちは、開発担当の米原です。
HCL Designer を長期間使っていると、アプリケーション一覧がどんどん増えていきます。
最初は気にならなくても、増えていくと起動や一覧表示が遅くなることがあります。
私の場合はテスト用に色々なバージョンのアプリを作成するので、結構増えてしまいがちです。
通常は一覧から右クリックで削除できますが、数が多いとひとつずつ消す作業は非常に手間です。
今回は、一括削除や直接編集で一覧をスッキリ整理する方法を解説します。
備忘もかねてブログに残します。

(↑テスト用に作成したので件数は少ないです)
1. アプリケーション一覧が増えると何が起きる?
-
Designer の起動時間が長くなる(影響大)
-
一覧のスクロールが遅くなる
-
必要なアプリが探しにくくなる(Desingerで整理している人は影響あり?)
これらは、一覧の管理情報が内部ファイルに溜まっていくことで起こっているのではないかと思われます。
定期的な整理で、動作を軽くすることができます。
2. 通常の削除方法(ひとつずつ削除)

-
アプリケーション一覧画面で、削除したいアプリを右クリック
-
「削除」を選択
利点
-
安全・確実で、間違えて消すリスクが低い
欠点
-
100件以上あると、削除作業だけでかなり時間がかかる
3. 一括削除する方法
実は、Designer のアプリケーション一覧は wsInfo.xml という1つのファイルに保存されています。
このファイルを削除すると、一覧が完全にリセットされます。
-
Designer を終了する
-
以下のパスに移動する
Data\workspace\.metadata\.plugins\com.ibm.designer.domino.ide.resources\ -
wsInfo.xmlファイルをバックアップする(任意の場所にコピー) -
元の
wsInfo.xmlを削除 -
Designer を再起動 → アプリケーション一覧が空になる(NotesClientsも開いていたら閉じた方がよさそう)
ポイント
-
削除するとすべての一覧が消えるので、必要なものがある場合は必ずバックアップを取っておきましょう。
4. wsInfo.xml を直接編集する方法
wsInfo.xml は XML形式のシンプルなテキストファイルです。
中身を開くと、登録されているアプリごとに同じようなタグが並んでいます。
編集手順
-
Designer を終了する
-
wsInfo.xmlをテキストエディタ(例:Notepad++)で開く -
不要な
<workspaceItem>のブロックを削除 -
必要なら、新しい
<workspaceItem>を追加することも可能 -
保存して閉じる → Designer を起動して反映を確認
注意点
-
XML のタグ構造を壊すと読み込めなくなる
-
必ずバックアップを取ってから作業する
編集の詳細は別途調べて記事として残す予定です。
まとめ
-
アプリケーション一覧が多いと Designer の動作が遅くなる
-
少数なら右クリック削除、大量なら
wsInfo.xmlの削除が効率的 -
XMLの構造を理解すれば、必要なアプリだけ残すことも可能
定期的に整理することで、快適な開発環境を保つことができます。
一度 wsInfo.xml の扱いに慣れれば、起動スピード改善にも直結します。
私の場合はすぐ一覧が溜まってしまうので、一括削除をおこなっております。
ではでは、今回はこの辺りで失礼いたします。
2025年08月16日
こんにちは、開発担当の米原です。
NotesDesigner, NotesClientsを使用していてこのようなことになっていませんか??
以前に「テクてくlotus技術者夜会」にてお話しした話なのですが、案外周りの人も知らなかったとのことですので
備忘もかねてブログに残します。
- 開発行ってると、設計を選択しても表示されるまでに時間がかかる
- だんだん反応が鈍くなり、最後には予期せぬエラーでDesignerが落ちる。。。
- Notes Designer で開発行ってると、数時間後にNotes Designer がフリーズして使えなくなる
まずは使用中のメモリの状態を見てみましょう
I am text block. Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
画面の下にメモリの使用状況がみれるようになります。
操作方法は以下の通りです。
- HCL Notes Designerを起動します
- 画面上メニューの「ファイル」を選択
- プリファレンスを選択
- 設定の一覧を選択
- ピープ・ステータスを表示のチェックをON

すると、画面下に使用メモリが表示されます。
「256M中の60M」となっていますが、現在256Mbyte確保しているうちの60Mbyte使ってますとの意味合いとなります。

XPageなどで設計が複雑なものや、カスタムコントロールが多くある設計、タブを結構開くとだんだん仕様メモリが増えて限度を超えるとメモリの開放が間に合わなかったりして処理が遅くなったりします。
そのために、割り当てるメモリを設定するパラメータがNotes.iniに用意されています。
Notes.iniは通常は「HCL\Notes」配下にあるかと思われます。
Notesのバージョンは、V12.0.1からになります。
(設定例)
WCT_vmarg.Xmx=-Xmx2048m
Notes/Domino Designers が消費するメモリの最大量
WCT_vmarg.Xms=-Xms1024m
Notes/Domino Designers が消費するメモリの最小量を定義します。
WCT_vmarg.Xmca=-Xmca1024k
Notes/Domino Designers が最小量よりも多くのメモリを必要とするときに、メモリを増加させる単位となるブロックサイズを定義します。
詳細な設定等の情報はこちらにございます。
HCL Customer Support
ちなみに初期値は
WCT_vmarg.Xmx=-Xmx256m
WCT_vmarg.Xms=-Xms48m
WCT_vmarg.Xmca=-Xmca8k
となっています。
ご使用のマシンスペックと相談してメモリのサイズを変更してみましょう。
メモリをあまり積んでいないマシンでメモリ確保領域を多くとると別のシステムが動かなくなったり、余計遅くなったりするので注意が必要です。
それでは今回はここまでとします。
2025年05月12日
こんにちは、開発担当の米原です。
本日は最近XPages開発でハマった時のお話です。
設計
Xpage : xpTest001
CstomControl : ccTest001
style sheet : test001.css
.bk_001{
background:rgb(255, 0, 0);
}
.bk_002{
background:rgb(0, 256, 0);
}
.tbl_001 {
width: 90%;
text-align: center;
border-collapse: collapse;
border-spacing: 0;
margin: 50px 50px;
}
.tbl_001 th {
padding: 10px;
background: #e9faf9;
border: solid 1px #778ca3;
}
.tbl_001 td {
padding: 10px;
border: solid 1px #778ca3;
}
どこが原因だったのか
原因ですが
カスタムコントロールの ccTest001内でセットしている
styleClassに設定していました styleClass=”bk_002″ が原因でした。
.bk_002{
background:rgb(0, 256, 0);
}
すごい単純なミスなのですが、RGBの範囲ですが、 0~255 でして、256はダメですね。
今回はWebの画面もちゃんと、緑色も出ていましたので、なぜか設計のみ開くことが出来なくなる現象となりました。
エラー内容が表示されず分からない所だったので、初めはDBがつぶれたかと思い、
再度作成し直したりしたりと色々試行錯誤しておりました。
原因さえ分かれば大したことではないのですが、なかなかはまってしまいましたので、似た様な所でお困りの方がいましたら、参考にしていただければと思います。
設計が開かなくなったら、XPageならまずその中に含有されいるカスタムコントロールを疑い、簡易化しながらどこが怪しいか切り分けて、カスタムコントールに問題が無い場合はその中で呼んでるカスタムコントロールを除外や、今回の様にカスタムコントロール内で使用しているスタイルシートなどを疑っていくと原因が見つけやすいかと思われます。
あとですね、今回はNotesのV9で発生しておりまして、今回のブログを書く際に、V12でも試してみましたら、
何とちょっと画面がかわっておりまして、もう少しエラーが詳しく表示されていました。
エラー内容に
java.lang.IllegalArgumentException: Argument not valid
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.RGB.<init>(Unknown Source)
at com.ibm.etools.xve.renderer.internal.style.CSSColorUtil.stringToRGB(Unknown Source)
CSSのRGBあたりに何かしら問題があるよ的なものがでていますね。
V12ならもしかしらすぐ解決できていたかもしれません。
NotesDominoも進化し続けているので、バージョンを上げる方がより快適に開発できそうですね。
今回はテスト的に単純な設計を作成してでしたが、
実際ハマった設計はもっと複雑なものでして数時間ハマりました。。。
参考にしていただければと思います。
それでは今日はこの辺で失礼いたします。
2024年10月22日
こんにちは開発担当の米原です。
今回は、日時をユリウス日(ジュリアン日)に変換しないといけないケースがありましたので、その時の備忘です。
ユリウス日(Julian Day、JD)とは
ユリウス暦紀元前4713年1月1日の正午(世界時)からの日数です。
ユリウス日は、日付が長期にわたり連続するため、日数計算やさまざまな暦の関連付けなど、幅広く使われています。
サンプルコード(XPages サーバサイドJavascript)
//ジュリアン日変換
function funcToJulianDay(p_year, p_month, p_day) {
//月が1月または2月の場合、前の年の13月または14月とみなすみたい
if (p_month <= 2) {
p_year -= 1;
p_month += 12;
}
var jDay = 0;
var seireki = 0;
var correct = 0;
//指定された年の世紀部分
seireki = Math.floor(p_year / 100);
//400年周期での閏年の補正
correct = 2 - seireki + Math.floor(seireki / 4);
// 年を365.25日と見なし計算
//基準年である紀元前4713年からの年数をプラス
//月の部分を日数に変換(30.6001 を掛けることで、月の平均日数(約30.6日)を使って月数を日数に変換)
//日の部分をそのまま加算 1524.5(基準日(紀元前4713年1月1日正午)との補正)
jDay = Math.floor(365.25 * (p_year + 4716)) +
Math.floor(30.6001 * (p_month + 1)) +
p_day + correct - 1524.5;
return jDay;
}
//呼び出し元サンプル(今日の日付を取得し変換)
function test001(){
try{
var year = 0;
var month = 0;
var day = 0;
var dt:Date = @Today(); // 今日のの日時を取得してみる
year = dt.getFullYear();
month = dt.getMonth() + 1;
day = dt.getDate();
var julianDay = funcToJulianDay(year, month, day);
print("ユリウス日:", julianDay);
}catch(e){
print("Error in test001:"+e)
}
}
参考にどうぞ。
2024年10月18日





