웹개발 중에 따옴표 처리 문제..

MySql 쿼리 처러하다 보니 따옴표 처리 이거 장난 아니구나~ ㅜㅜ
특히 이중 따옴표 처리.. ㅜㅜ.. 이것때메 어찌나 헤맷떤지..
이게 지금 이번뿐이 아니다.. 작년에도 이와 비슷한 문제로 좀 고생했는데…

그때는 쿼트나 떠블쿼트 전부 찾아서 다른문자로 replace 해서 DB로 저장하고, 불러들일때 다시 파싱해서 처리했떤 기억이 있다.

좀 찾아보니..  XML에는 CDATA 와 PCDATA 라는게 있더군..
암튼 난 그래서, 따옴표(“) 를 –> " 로 바꿔서 처리했다..
<a onclick=’comment_lists_toggle(&quot;”+rs.getString(6)+”&quot;, “+rs.getString(5)+”); return false;’ href=’./comment’> 댓글(“+rs.getString(3)+”) </a>

그렇다면, 과연 CDATA와 PCDATA 라는게 멀까?..
PCDATA(Parsed  Character DATA)는 말 그대로 파서가 해석하는 문자 데이타를 말한다.
쉽게 말하면, XML 문서를 브라우저가 읽을때, 브라우저 XML 파서가 문자열을 해석해서 디스플레이를 한다는 것이다.

예로들면, 아래와 같은

<title> XML &amp; JAVA </title>

XML 은  파서가 해석해서 <title> XML & JAVA </title> 로 치환하여 디스플레이 하는것이다.

그렇다면, CDATA 는 먼가?
CDATA는 XML 파서가 해석하지 않고 바로 Application 으로 보내버린다.

즉, <![CDATA[ 문자 데이타 ]]> 요렇게 섹션을 지정하면 안쪽의 문자 데이터는 파서가 해석을 안한다.
게시판에서 특수문자를 허용하는 경우엔 요렇게 CDATA로 묶어서 처리하면 된다.

특수문자를 정리하면 아래와 같다.

< –> &lt;       ex) 3 < 5  –> 3 &lt;  5
> –> &gt;      ex) 5 > 3  –> 5 &gt; 3
& –> &amp;   ex)<title>XML & Java</title>
                                  –><title>XML &amp; Java</title>
”  –> &quot;  ex)<book kind=”computer”>
                                  –><book kind=”&quot;computer&quot;”>
‘   –> &apos;  ex)<book kind=’rhmye’s book’>
                                  –><book kind=’rhyme&apos;s book’>

XML 에서 문자 참조를 할때는 10진수와 16진수를 구별해서 쓸때도 있다.
XML 문법은 간단하다. 

&#x(16진수 코드값);
&#(10진수 코드값);

스페이스 – 16진수: &#x20;    10진수: &#32;
  탭 – 16진수: &#x9   10진수: &#9;

———————– updated 2008.02.25 ————————
검색하다 찾아냈다..
그밖에 특수문자 , Escape Sequences

음… 찾은거 중엔.. 이곳이 가장 잘 정리 되어 있다!!
http://www.hybridelephant.com/computer/tutorial/spechar.html

맥북은 좋으나… 여전히…

잘 모르겠당…어렵당… 

그나마 다행스러운건.. 내가 리눅스 유경험자 라는 사실… 
보자마자 어랏… 이거 리눅스 틱한데.. 했는데..

기반이 유닉스였다.. 


역시… 

정말 맥북.. 
살사람들은 고심하고 사라!!

순간 당황했다.. 

한영키도 없어서.. 한영키 바꾸는데도 꾀나 검색시간을 요구했다..ㅎㅎㅎ 
아직은 익숙하지 않아서 잘 모르겠으나… 
Delete 키와 한/영키가 없다는것은 참으로 …. 

찾아냈다..+_+_+_+

이런.. FN + Del 였따니… 

이런..

키보드 조합 찾기란.. 정말 보물찾기 같은 느낌.. ㅋㅋㅋ 

그래도 액정이 밝아서 참으로 좋다.. 


———- update ——– 

맥북을 맘먹고 사용한지 2개월째…
슬슬 적응이 되어 가고 있다.. 
인지 공학적 측면에서 접근하면, 난 이제 슬슬 경험적 무의식 단계에 접어든거 같다. 
슬슬 맥북 단축키에 익숙해지고, 점점 사용성이 높아진다.. 

그러나 여전히 직관적이지 못한 인터페이스중에 하나는 
delete키 -_-

맥북은 FN키와 delete키 조합으로 백스페이스 기능까지 같이하고 있다.. 

일종의 모드를 사용하고 있는데, 불편하다..-_-
delete키도 많이 쓰고 backspace도 많이 쓰는데.. 
그냥 독립키로 하면 안되나?-_-
맨날 헷갈린다.. 아직 적응이 안된건지..
아니면 헷갈림에 적응된건지..-_- 

인터페이스 디자인 원리에 의하면, 이건 영~ 불편하다.. 
이놈의 인터페이스가 나의 글쓰기를 자꾸 방해한다.. 

정말 이것 좀 어떻게 해결 안되낭? -_-

ASP.NET AJAX 컨트롤 사용시 Sys is not defined 에러 처리

[문제의 원인]
Sys is not defined 라는 에러는 Sys 라는 글로벌 변수가 javascript 에서 정의가 되어 있지않아서 생긴문제다.
이문제가 왜 일어날까?..

[문제의 발단]
작년에 ASP.NET 2.0 AJAX 컨트롤 기반으로 웹개발후, 프레임웍과 개발툴을 업그레이드한후,
개발한 사이트를 돌렸을경우 AJAX 컨트롤에서 버젼 오류가 생겼다.
즉, AJAX Lib 1.0 과 AJAX Lib 3.0 어셈블리가 서로 버젼을 충돌을 일으켰다.

[원인 분석]
내가 이문제를 겪은 주원인은 .NET Framework 2.0 에서 3.0 으로 업그레이드하고,.. VS2008 beta 버젼을 다운로드해서 사용하다가. 정식 버젼인 Visual Studio 2008 Express  버젼이 나오면서 업그래이드 후에 나타난 문제다.

내가 여기서 실수한건 베타 버젼을 제대로 못지우고, 설치를 강행해서 그런거 같다. 즉, 레지스트리 파일을 열어서 강제로 설정 레지스트리를 지웠지만, 실제로 맴핑되어있던 Assembly와 DLL 파일을 지우지도 못했고, 그밖에 찌꺼기 레지를 지우지 못해서 설정이 꼬였던거 같다.

[해결책]
여튼,  해결한 방법은 간단했다.
기존에 백업해두었던.. Web.config 파일을 덮어 씌웠는데.. 바로 해결됐다..-ㅜ..
(젠장 3일이나 삽질했다..ㅜㅜ..)

.NET Framework 2.0 기반의 Ajax 1.0 컨트롤 설정은 아래와 같다.

업그레이드후 Web.config 파일을 기존 버젼과 비교해 보니 아래 빨간색 부분이 누락되어있었고…녹색부분의 색션부분의 Extensions 버전이 달랐다..

<?xml version=”1.0″?>
<configuration>
  <configSections>
    <sectionGroup name=”system.web.extensions” type=”System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
      <sectionGroup name=”scripting” type=”System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
        <section name=”scriptResourceHandler” type=”System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication”/>
        <sectionGroup name=”webServices” type=”System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
          <section name=”jsonSerialization” type=”System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”Everywhere”/>
          <section name=”profileService” type=”System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication”/>
          <section name=”authenticationService” type=”System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication”/>
        </sectionGroup>
      </sectionGroup>
    </sectionGroup>
  </configSections>
  <connectionStrings>
    <add name=”RIKIConnectionString” connectionString=”Data Source=RIKI;Initial Catalog=RikiDB;Persist Security Info=True;User ID=*********;Password=*******” providerName=”System.Data.SqlClient”/>
  </connectionStrings>
  <system.web>
    <pages>
      <controls>
        <add tagPrefix=”asp” namespace=”System.Web.UI” assembly=”System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
        <add namespace=”AjaxControlToolkit” assembly=”AjaxControlToolkit” tagPrefix=”ajaxToolkit”/>
      </controls>
    </pages>
    <!–
          Set compilation debug=”true” to insert debugging
          symbols into the compiled page. Because this
          affects performance, set this value to true only
          during development.
    –>
    <compilation debug=”true”>
      <assemblies>
        <add assembly=”System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
        <add assembly=”System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
        <add assembly=”System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A”/>
        <add assembly=”System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>
      </assemblies>
    </compilation>
    <httpHandlers>
      <remove verb=”” path=”.asmx”/>
      <add verb=”” path=”.asmx” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
      <add verb=”” path=”_AppService.axd” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
      <add verb=”GET,HEAD” path=”ScriptResource.axd” type=”System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ validate=”false”/>
      <add verb=”GET” path=”FtbWebResource.axd” type=”FreeTextBoxControls.AssemblyResourceHandler, FreeTextBox”/>
    </httpHandlers>
    <httpModules>
      <add name=”ScriptModule” type=”System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
    </httpModules>
    <authentication mode=”Forms”>
      <forms name=”.AUTHCOOKIE” loginUrl=”login/login.aspx” protection=”All”/>
    </authentication>
    <authorization>
      <deny users=”?”/>
    </authorization>
  </system.web>
  <system.web.extensions>
    <scripting>
      <webServices>
        <!– Uncomment this line to customize maxJsonLength and add a custom converter –>
        <!–
      <jsonSerialization maxJsonLength=”500″>
        <converters>
          <add name=”ConvertMe” type=”Acme.SubAcme.ConvertMeTypeConverter”/>
        </converters>
      </jsonSerialization>
      –>
        <!– Uncomment this line to enable the authentication service. Include requireSSL=”true” if appropriate. –>
        <!–
        <authenticationService enabled=”true” requireSSL = “true|false”/>
      –>
        <!– Uncomment these lines to enable the profile service. To allow profile properties to be retrieved
           and modified in ASP.NET AJAX applications, you need to add each property name to the readAccessProperties and
           writeAccessProperties attributes. –>
        <!–
      <profileService enabled=”true”
                      readAccessProperties=”propertyname1,propertyname2″
                      writeAccessProperties=”propertyname1,propertyname2″ />
      –>
      </webServices>
      <!–
      <scriptResourceHandler enableCompression=”true” enableCaching=”true” />
      –>
    </scripting>
  </system.web.extensions>
  <system.webServer>
    <validation validateIntegratedModeConfiguration=”false”/>
    <modules>
      <add name=”ScriptModule” preCondition=”integratedMode” type=”System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
    </modules>
    <handlers>
      <remove name=”WebServiceHandlerFactory-Integrated”/>
      <add name=”ScriptHandlerFactory” verb=”*” path=”*.asmx” preCondition=”integratedMode” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
      <add name=”ScriptHandlerFactoryAppServices” verb=”*” path=”*_AppService.axd” preCondition=”integratedMode” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
      <add name=”ScriptResource” preCondition=”integratedMode” verb=”GET,HEAD” path=”ScriptResource.axd” type=”System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>

    </handlers>
  </system.webServer>
</configuration>