【问题标题】:Boolean values in local language本地语言的布尔值
【发布时间】:2013-03-23 12:09:46
【问题描述】:

这个问题很久以前就在serverfault 上提出过,但没有可用的遮阳篷。我希望从那时起有人遇到过它并找到了解决方案。

例子:

<%
Response.Write True
Response.Write "<hr>"
Response.Write "test:" & True
%>

输出:

True
--------------
test:Waar

如您所见,只要组合输出,它就会变成本地字符串('Waar' 是荷兰语的真)。我需要它保持“真实”。

我该如何改变呢?我不介意在页面的开头放置一些代码,但我不能在整个代码中更改True 的所有实例。所以创建一个像下面这样的函数来返回正确的字符串是行不通的。

Function PB(pVal)
  If pVal Then
    PB = "true"
  Else
    PB = "false"
  End If
End Function

【问题讨论】:

  • 请问您期待什么输出?
  • 总是正确的。所以第二个回复应该是test:True
  • 不幸的是,没有一个答案是正确的或解决了这个问题。但我觉得@gpinkas 把最大的精力放在寻找解决方案上,并且有一些我无法立即放弃的想法。
  • @HugoDelsing 不确定您是否已经解决了这个问题,但我想到了另一件事:您是否尝试过为 IIS 使用特定的 Windows 用户而不是 IUSR?然后尝试更改该用户的区域设置。我还没有尝试过,所以我不确定这是否有帮助
  • 刚刚试了一下,但它不起作用。文本保持在荷兰语。感谢您的努力

标签: iis-7 asp-classic locale windows-7-x64


【解决方案1】:

奇怪,无论设置哪种语言环境,我都无法让我的 IIS 以我的本地语言输出布尔值。

你找到这个KB article 了吗?

有一个注册表设置的描述可以解决问题:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT

我不想弄乱我的生产服务器,所以我还没有尝试这个。


第一答案:

您可以“欺骗”VB 使用您自己的函数。如果您将这些函数添加到页面顶部,VB 将更喜欢这些函数而不是内置函数,在本例中为CStrTrim。也许这会有所帮助。

    Function PB(pVal)
        If pVal Then
            PB = "true"
        Else
            PB = "false"
        End If
    End Function

    Function CStr(pVal)
        CStr = PB(pVal)
    End Function

    Function Trim(pVal)
        Trim = PB(pVal)
    End Function

输出:

    True
    --------------
    test:true
    --------------
    test:true
    --------------
    test:true

【讨论】:

  • 基本上你正在做一个覆盖。在 VB 中对此进行了测试(我的系统上没有 Classic ASP 设置)。 Trim() 有效,但 CStr() 给了我一个语法错误。但 Str() 也有效。
  • 是的,我在经典 ASP (IIS 7.5) 中对此进行了测试,没有语法错误。这肯定不是最干净的解决方案,但您可以使用它。
  • Cstr 和 Trim 的使用是另一个 awnser 说这是解决方案的结果。我只使用True,没有任何方法。更改应该是通过更改某些服务器设置。通过 ASP 或直接在 IIS7 中
  • 嗨,我一直在用它进行测试,但是更改语言环境对值没有影响。更改注册表似乎也没有任何效果。可能是因为我在服务器上登录并且设置覆盖了无人登录时的默认行为。
  • 当 MS-KB 中将默认行为描述为“完全随机”时,这令人放心...顺便说一句,我还尝试在 web.config 文件中设置文化,这没有任何改变任何一个。 :(
【解决方案2】:

我做了这样的事情,但目前没有机器来测试你的案例:

<%
Response.Write FormatDateTime(Now) & "<br />"
oldLocale = SetLocale(1026) 'Bulgarian
Response.Write FormatDateTime(Now) & "<br />"
SetLocale oldLocale 
Response.Write FormatDateTime(Now) & "<br />"
%>

...从另一个 SO question 看来,上面的方法不起作用。

如果你尝试这些会发生什么: Response.Write "test:" &amp; CStr(True) 要么 Response.Write "test:" &amp; Trim(True) 使用或不使用 SetLocale?

【讨论】:

  • 更改区域设置和/或使用CStrTrim 时没有变化
【解决方案3】:

这就像字符串连接在 vbscript 中起作用。

来自vbscript language reference

"当表达式不是字符串时,将其转换为字符串 亚型。如果两个表达式均为 Null,则结果也为 Null。然而, 如果只有一个表达式为 Null,则该表达式被视为 与另一个表达式连接时的零长度字符串 ("")。 任何为 Empty 的表达式也被视为零长度字符串。”

【讨论】:

  • 显然类型必须更改为字符串才能用作一个类型,但它没有说“这发生在windows语言中并且无法更改”。
【解决方案4】:

如果 SetLocale 不起作用,那么我认为最好的办法是创建一个函数。

Function TF(B)
   If B Then
      TF = "True"
   Else
      TF = "False"
   End If
End Function

那么不要这样说:

Response.Write "test:" & True

你会这样说:

Response.Write "test:" & TF(True)

【讨论】:

  • 正如您在问题中所读到的那样,创建一个函数是行不通的。它确实看起来很像我在相关问题部分中对stackoverflow.com/questions/15770025/… 的回答
  • 我在这里发帖后看到了您对该问题的评论。而且,我知道函数不是您想要的,但它可能是您唯一的选择。如果你愿意把所有的True都改成Trim(True),那改成TF(True)岂不是一样的工作。
  • 另外,您没有说明为什么需要 True & False 的英文形式。如果它是为了打印到文件以便稍后在需要标准的地方输入,那么使用 -1 和 0 怎么样。CInt(TRUE)
【解决方案5】:

我也被这个“问题”“抓住”了。 确实,这不是问题:

问题(示例)

在 SQL 语句中使用布尔数据时,我遇到了同样的问题。 在我的法语服务器上,我的 SQL 语句如下:

<%
'Set my boolean value
Dim myBoolean
myBoolean = True

'Set my SQL Statement
Dim MySQLStatement
MySQLStatement = "SELECT * FROM MyTable WHERE MyBooleanField = " & myBoolean
'=> Here, as MySQLStatement is a STRING, the boolean data was "converted/rendered" as a localized string. So that leads to this output :
'=> SELECT * FROM MyTable WHERE MyBooleanField = Vrai
'Obviously, that SQL Statement is incorrect, because the SQL Engine does NOT understand what is the "Vrai" word - It should be "True" instead.
%>

解释:

  • 在您的 Windows 系统上设置哪些区域设置无关紧要:基础数据没有任何反应。布尔数据类型仍然是BOOLEAN,可以是英语、法语、德语、俄语、泰语……或任何您想要的语言。
  • 事实是数据只是被渲染为本地化的STRING(如日期)。

解决方案

经过大量阅读论坛主题后,解决方案不是更改Windows系统上的区域设置,也不是更改注册表项,也不是更改Session.LCID,... 绝对且纯代码的解决方案是将布尔值 (True|False) 转换为整数 (0|1)。然后,这个 Integer 将可以安全地在字符串中使用,并且将保持 (0|1)。

这是以非本地化形式使用/转换/呈现布尔值的安全方法使用整数值

<%
'Set my boolean value
Dim myBoolean
myBoolean = True

'Set my SQL Statement
Dim MySQLStatement
MySQLStatement = "SELECT * FROM MyTable WHERE MyBooleanField = " & BoolToInt(myBoolean)
'=> Here, as MySQLStatement is a STRING, and as the boolean data was previously "converted/rendered" as an integer, we got this correct SQL Statement :
'=> SELECT * FROM MyTable WHERE MyBooleanField = 1
'This SQL Statement is correct, as the SQL Engine DOES understand that 1 is a boolean.

'This Function Returns an INTEGER value based on a BOOLEAN value
Function BoolToInt(v)
    'INPUT:
    'v      Boolean value    

    'OUTPUT:
    'Integer (0|1)    

    Dim b_OUT
    b_OUT = v    

    'If the Input value is a "True" boolean value (in any language)
    if (b_OUT = True) then
        BoolToInt = cint(1)
    'If the Input value is a "False" boolean value (in any language)
    elseif (b_OUT = False) then
        BoolToInt = cint(0)
    end if
End Function 'BoolToInt
%>

我真的希望它能拯救你的一天!

【讨论】:

    【解决方案6】:

    您可以尝试在页面开头将 Response.LCID 或 Session.LCID 设置为 1033,但这也会影响其他内容(如日期和货币变量)的显示方式。

    1033 是美国的区域设置 ID

    【讨论】:

    • 正如@Tom Collins 所说,这不会有任何帮助。事实上,布尔值仍然是布尔值无论系统设置什么语言。将此布尔值转换为字符串后,将使用本地化字符串(“True”、“Vrai”、“Verdadero”、“Wahr”……)。唯一的解决方案是测试布尔变量是否为 True,然后返回您需要的文本。例如:If (MyVar = True) then:Response.Write "True":else:Response.Write "False":end if
    【解决方案7】:

    尝试 2:

    <%
    arr=Array("False","True")
    
    Response.Write True
    Response.Write "<br /><br />"
    
    Response.Write "" & arr( abs(True) ) & "<br />"
    Response.Write "" & arr( abs(False) ) & "<br />"
    %>
    

    【讨论】:

    • 这仍然为truefalse 的出现增加了一些东西。在这种情况下,我自己的问题甚至不仅仅是PB(True)
    【解决方案8】:

    如果您不介意将区域设置更改为美国设置,我找到了解决方案。它涉及更改注册表。这已经在 Windows 7 西班牙语中进行了测试,现在它提供原生 True/False 而不是 Verdadero/Falso。

    1. 导航到 HKEY_USERS/.Default/Control Panel/International 并用手机拍一张漂亮的照片,以防万一搞砸了。您还可以通过单击“国际”然后单击文件/导出来备份注册表项

    2. 打开记事本并将其粘贴到其中(您也可以在注册表中手动更改值):

    -----------------粘贴此行下方的内容-------------

    Windows Registry Editor Version 5.00
    
    [HKEY_USERS\.DEFAULT\Control Panel\International]
    "Locale"="00000409"
    "LocaleName"="en-US"
    "s1159"=""
    "s2359"=""
    "sCountry"="United States"
    "sCurrency"="$"
    "sDate"="/"
    "sDecimal"="."
    "sGrouping"="3;0"
    "sLanguage"="ENU"
    "sList"=","
    "sLongDate"="dddd, MMMM dd, yyyy"
    "sMonDecimalSep"="."
    "sMonGrouping"="3;0"
    "sMonThousandSep"=","
    "sNativeDigits"="0123456789"
    "sNegativeSign"="-"
    "sPositiveSign"=""
    "sShortDate"="M/d/yyyy"
    "sThousand"=","
    "sTime"=":"
    "sTimeFormat"="h:mm:ss tt"
    "sShortTime"="h:mm tt"
    "sYearMonth"="MMMM, yyyy"
    "iCalendarType"="1"
    "iCountry"="1"
    "iCurrDigits"="2"
    "iCurrency"="0"
    "iDate"="0"
    "iDigits"="2"
    "NumShape"="1"
    "iFirstDayOfWeek"="6"
    "iFirstWeekOfYear"="0"
    "iLZero"="1"
    "iMeasure"="1"
    "iNegCurr"="0"
    "iNegNumber"="1"
    "iPaperSize"="1"
    "iTime"="0"
    "iTimePrefix"="0"
    "iTLZero"="0"
    
    [HKEY_USERS\.DEFAULT\Control Panel\International\Geo]
    "Nation"="244"
    

    ----------------- 不要粘贴此行 -------------

    1. 另存为english.reg(或任何.reg)

    2. 双击它。

    我不必重新启动计算机即可使更改生效。

    -------- 更新 ----------

    不起作用。如果我用这个创建一个空白的 asp 页面: 它会回答 True(英文),但是一旦我在字符串中连接 True,它就会再次变成 Verdadero。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多