Strings.StrConvで全角に変換しようとする文字列にサロゲートペア文字が含まれていると"??"に変換されてしまいます。
Debug.WriteLine("𠀋=" + Strings.StrConv("𠀋", VbStrConv.Wide)); // 𠀋=??と表示される
「.NET Frameworkは文字列を内部的にUnicodeしており、標準機能のStrConvを使用しているからヨシ!」と思っていると失敗するので注意が必要です。
参考
Strings.StrConvで全角に変換しようとする文字列にサロゲートペア文字が含まれていると"??"に変換されてしまいます。
Debug.WriteLine("𠀋=" + Strings.StrConv("𠀋", VbStrConv.Wide)); // 𠀋=??と表示される
「.NET Frameworkは文字列を内部的にUnicodeしており、標準機能のStrConvを使用しているからヨシ!」と思っていると失敗するので注意が必要です。
参考
<cc1:FileDownloadButton ID="FileDownloadButton1" runat="server"
Text="Download"
OnDownloading="FileDownloadButton1_Downloading"
OnDownloaded="FileDownloadButton1_Downloaded"/>
protected void FileDownloadButton1_Downloading(object sender, EventArgs e)
{
// Tempファイルを作成する
var path = Path.GetTempFileName();
var file = new FileInfo(path);
// Tempファイルへデータを出力する
using (var s = file.OpenWrite())
using (var w = new StreamWriter(s))
{
w.WriteLine("Hello");
w.Flush();
}
// FileDownloadButtonのFileプロパティへTempファイルをセットする
FileDownloadButton1.File = file;
}
protected void FileDownloadButton1_Downloaded(object sender, EventArgs e)
{
// Tempファイルを削除する
FileDownloadButton1.File.Delete();
}
namespace HttpHandlerSample
{
// 動的にPNG画像を生成するクラス
public class PngHandler : IHttpHandler
{
// このオブジェクトが再利用可能かを返すプロパティ
public bool IsReusable
{
get
{
return true;
}
}
// ...略...
// HTTPリクエストを処理するメソッド
public void ProcessRequest(HttpContext context)
{
// 画像を生成する
using (var image = GenerateImage())
{
// PNG形式でHTTPレスポンスへ出力する
var output = context.Response.OutputStream;
image.Save(output, ImageFormat.Png);
output.Flush();
}
// Content-TypeヘッダをPNG形式に設定する
context.Response.ContentType = "image/png";
}
// ...略...
}
}
<configuration>
<system.webServer>
<handlers>
<add name="PngHandler" path="*.png" verb="GET" type="HttpHandlerSample.PngHandler"/>
</handlers>
</system.webServer>
</configuration>
ちなみにvar sb = new StringBuilder()
.Append("select *").Append(Environment.NewLine)
.Append(" from Table1").Append(Environment.NewLine)
.Append(" where Column1 = @Value1").Append(Environment.NewLine);
var sw = new StringWriter();
sw.WriteLine("select *");
sw.WriteLine(" from Table1");
sw.WriteLine(" where Column1 = @Value1");
class Class1
{
private readonly DbProviderFactory factory;
private readonly string connectionString;
public Class1(DbProviderFactory factory, string connectionString)
{
this.factory = factory;
this.connectionString = connectionString;
}
public List<object> Method1()
{
using (var conn = factory.CreateConnection())
using (var command = factory.CreateCommand())
{
conn.ConnectionString = connectionString;
conn.Open();
command.Connection = conn;
command.CommandText = "select * from Table1 where ID = @ID";
var param = factory.CreateParameter();
param.ParameterName = "ID";
param.Value = "ID1";
command.Parameters.Add(param);
var reader = command.ExecuteReader();
var result = new List<object>();
while (reader.Read())
{
var arr = new object[reader.FieldCount];
reader.GetValues(arr);
result.Add(arr);
}
return result;
}
}
class MyPage : Page {
protected void Page_PreRender(object sender, EventArgs e) {
var args = "xxx"; // 例えば、詳細情報を表示するためのプライマリキー
var js = ClientScript.GetPostBackEventReference(this, args);
Table1.Rows[0].Cells[0].Attributes.Add("onclick", js);
}
}
// 上のクラスへIPostBackEventHandlerを実装
class MyPage : Page, IPostBackEventHandler {
...
public void RaisePostBackEvent(string eventArgs) {
// 例えばセッションへeventArgsをセットして詳細ページへ遷移する
Session.Add("key", eventArgs);
var detail = ResolveUrl("~/MyDetailPage.aspx");
Server.Transfer(detail);
}
}
var path = VirtualPathUtility.Combine(HttpRuntime.AppDomainVirtualPath,
"Web.config");
var conf = WebConfigurationManager.OpenWebConfiguration(path);
class NetworkConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("LocalHost")]
public NetworkConfigElement LocalHost
{
get { return base["LocalHost"] as NetworkConfigElement; }
set { base["LocalHost"] = value; }
}
[ConfigurationProperty("Networks")]
public NetworkConfigElementCollection Networks
{
get { return base["Networks"] as NetworkConfigElementCollection; }
}
}
class NetworkConfigElement : ConfigurationElement
{
[ConfigurationProperty("IPAddress")]
public string IPAddress
{
get { return base["IPAddress"] as string; }
set { base["IPAddress"] = value; }
}
}
class NetworkConfigElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new NetworkConfigElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
NetworkConfigElement elm = element as NetworkConfigElement;
if (null == elm) return null;
return elm.IPAddress;
}
}
byte[] data = null;
using (var memory = new MemoryStream()) {
using (var gzip = new GZipStream(memory, CompressionMode.Compress)) {
int input = 0;
byte[] buffer = new byte[1];
while (-1 != (input = Console.Read())) {
buffer[0] = Convert.ToByte(input);
gzip.Write(buffer, 0, buffer.Length);
}
}
data = memory.ToArray();
}
var clientHandler = new HttpClientHandler(); clientHandler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
using(var client = new HttpClient(clientHandler))
using(var content = new ByteArrayContent(data))
{
content.Headers.ContentEncoding.Add("gzip");
using(var message = client.PostAsync(url, content).Result)
{
Console.WriteLine(message.Content.ReadAsStringAsync().Result);
}
}
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<clear />
<add name="file"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="TEXT-WRITER.log">
<!-- Warning以上を出力 -->
<filter type="System.Diagnostics.EventTypeFilter"
initializeData="Warning" />
</add>
</listeners>
</trace>
</system.diagnostics>
</configuration>
TraceTest Warning: 0 : TraceWarning TraceTest Error: 0 : TraceError
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<clear />
<!-- テキストファイル -->
<add name="file"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="TEXT-WRITER.log"
traceOutputOptions="Callstack, DateTime, LogicalOperationStack, ProcessId, ThreadId, Timestamp" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
TraceTest.exe Information: 0 : TraceInformation
ProcessId=5700
LogicalOperationStack=
ThreadId=1
DateTime=2014-02-02T12:47:28.3398027Z
Timestamp=6032477769
Callstack= 場所 System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
場所 System.Environment.get_StackTrace()
場所 System.Diagnostics.TraceEventCache.get_Callstack()
場所 System.Diagnostics.TraceListener.WriteFooter(TraceEventCache eventCache)
場所 System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String message)
場所 System.Diagnostics.TraceInternal.TraceEvent(TraceEventType eventType, Int32 id, String format, Object[] args)
場所 TraceTest.TraceTest.Main(String[] args)
namespace TraceTest
{
using System.Diagnostics;
public class TraceTest {
public static void Main(string[] args) {
Trace.TraceInformation("TraceInformation");
Trace.TraceWarning("TraceWarning");
Trace.TraceError("TraceError");
}
}
}
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<clear />
<!-- 標準出力 -->
<add name="console"
type="System.Diagnostics.ConsoleTraceListener" />
<!-- 区切りリスト -->
<add name="delimited-list"
type="System.Diagnostics.DelimitedListTraceListener"
initializeData="DELIMITED-LIST.log" />
<!-- イベントログ -->
<add name="eventlog"
type="System.Diagnostics.EventLogTraceListener"
initializeData="Application" />
<!-- テキストファイル -->
<add name="file"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="TEXT-WRITER.log" />
<!-- XML形式 -->
<add name="xml-writer"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="XML-WRITER.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
参考