8

这个问题很久以前就在serverfault上被问过,但没有工作 awnser。我希望有人遇到它并从那时起找到解决方案。

例子:

<%
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
4

8 回答 8

4

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

您是否已经找到此知识库文章

有一个注册表设置的描述可以做到这一点:

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
于 2013-04-22T15:39:40.180 回答
3

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

<%
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:" & CStr(True) 或者 Response.Write "test:" & Trim(True) 使用或不使用 SetLocale?

于 2013-04-02T15:17:35.717 回答
3

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

来自vbscript 语言参考

“只要表达式不是字符串,它就会被转换为字符串子类型。如果两个表达式都为 Null,则结果也为 Null。但是,如果只有一个表达式为 Null,则该表达式被视为零长度字符串(“” ) 与另一个表达式连接时。任何为空的表达式也被视为零长度字符串。

于 2013-04-18T11:37:36.730 回答
2

如果 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)
于 2013-04-18T13:01:08.980 回答
1

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

问题(示例)

在 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,使用英语、法语、德语、俄语、泰语、..或任何您想要的语言。
  • 事实是数据只是被呈现为本地化字符串(如日期)。

解决方案

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

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

于 2017-06-02T05:45:42.840 回答
0

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

1033 是美国的区域设置 ID

于 2013-04-25T07:49:26.720 回答
0

Attempt 2:

<%
arr=Array("False","True")

Response.Write True
Response.Write "<br /><br />"

Response.Write "" & arr( abs(True) ) & "<br />"
Response.Write "" & arr( abs(False) ) & "<br />"
%>
于 2013-04-25T13:53:23.423 回答
0

如果您不介意将区域设置更改为美国设置,我找到了解决方案。它涉及更改注册表。这已经在 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(或whatever.reg)

  2. 双击它。

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

- - - - 更新 - - - - -

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

于 2015-09-01T06:01:36.363 回答